Java反射获取方法,执行方法,获取注解
2017-11-16 15:29
344 查看
新建Person类:
package test.reflection.cal;
import test.reflection.annotation.AnnoTest;
/**
* 用于测试反射的类
* @author Administrator
*
*/
public class Person {
private int id;
private String name;
// public Person(){}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* 待测试的方法
* private 修饰
* 带注解
* @param i
* @return
*/
@AnnoTest(value = "what",name = "are you doing")
private String changeInfo(String i){
return i+" "+name;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + "]";
}
}
新建注解:
package test.reflection.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 自定义注解
* @author Administrator
*
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnoTest {
String name() default "this is an annotation";
String value() default "";
}
测试类:
package test.reflection.test;
import java.lang.reflect.Method;
import test.reflection.annotation.AnnoTest;
import test.reflection.cal.Person;
/**
* 反射测试
*
* @author Administrator
*
*/
public class ReflectionTest {
@SuppressWarnings("unchecked")
public static void main(String[] args) throws Throwable, SecurityException {
Person p = new Person();
Class<Person> clazz = (Class<Person>) p.getClass();
// 获取所有的方法
Method[] methods = clazz.getDeclaredMethods();
System.out.println("Person 的所有方法:");
for (Method method : methods) {
System.out.println("" + method.getName());
}
System.out.println();
// 获取getName方法,没有赋初值,结果为null
Method m0 = clazz.getDeclaredMethod("getName");
System.out.println("getName: " + m0.invoke(p));
// 获取setName方法
Method mset = clazz.getDeclaredMethod("setName", String.class);
mset.invoke(p, "dam");
System.out.println("setName之后 " + p.toString());
// 获取changeInfo 方法
Method m1 = clazz.getDeclaredMethod("changeInfo", String.class);
m1.setAccessible(true);// changeInfo方法用private修饰 ,这里需要设置为true才能获取
String res = (String) m1.invoke(p, " haha");
System.out.println("changeInfo:" + res);
// 获取changeInfo 方法上的注解
AnnoTest annoTest = (AnnoTest) m1.getAnnotation(AnnoTest.class);
System.out.println(annoTest.name());// 获取注解中的值
System.out.println(annoTest.value());// 获取注解中的值
}
}
package test.reflection.cal;
import test.reflection.annotation.AnnoTest;
/**
* 用于测试反射的类
* @author Administrator
*
*/
public class Person {
private int id;
private String name;
// public Person(){}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* 待测试的方法
* private 修饰
* 带注解
* @param i
* @return
*/
@AnnoTest(value = "what",name = "are you doing")
private String changeInfo(String i){
return i+" "+name;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + "]";
}
}
新建注解:
package test.reflection.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 自定义注解
* @author Administrator
*
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnoTest {
String name() default "this is an annotation";
String value() default "";
}
测试类:
package test.reflection.test;
import java.lang.reflect.Method;
import test.reflection.annotation.AnnoTest;
import test.reflection.cal.Person;
/**
* 反射测试
*
* @author Administrator
*
*/
public class ReflectionTest {
@SuppressWarnings("unchecked")
public static void main(String[] args) throws Throwable, SecurityException {
Person p = new Person();
Class<Person> clazz = (Class<Person>) p.getClass();
// 获取所有的方法
Method[] methods = clazz.getDeclaredMethods();
System.out.println("Person 的所有方法:");
for (Method method : methods) {
System.out.println("" + method.getName());
}
System.out.println();
// 获取getName方法,没有赋初值,结果为null
Method m0 = clazz.getDeclaredMethod("getName");
System.out.println("getName: " + m0.invoke(p));
// 获取setName方法
Method mset = clazz.getDeclaredMethod("setName", String.class);
mset.invoke(p, "dam");
System.out.println("setName之后 " + p.toString());
// 获取changeInfo 方法
Method m1 = clazz.getDeclaredMethod("changeInfo", String.class);
m1.setAccessible(true);// changeInfo方法用private修饰 ,这里需要设置为true才能获取
String res = (String) m1.invoke(p, " haha");
System.out.println("changeInfo:" + res);
// 获取changeInfo 方法上的注解
AnnoTest annoTest = (AnnoTest) m1.getAnnotation(AnnoTest.class);
System.out.println(annoTest.name());// 获取注解中的值
System.out.println(annoTest.value());// 获取注解中的值
}
}
相关文章推荐
- Java反射03 : 获取Class的注解、修饰符、父类、接口、字段、构造器和方法
- java反射获取类的类名、属性名、属性类型、方法、执行方法、构造函数
- java 反射机制 之 getMethod获取公有方法 getDeclaredMethod获取所有方法 然后invoke执行其所有方法
- java通过读取本地文件获取反射方法参数,执行对象方法
- java 利用反射获取类,实例化,并执行其内部方法
- java 反射获取方法并赋值,反射获取注解
- Java反射常用到的几个方法,获取Private字段,执行其他类的方法,获取类名
- JAVA反射获取属性注解,类方法
- 反射中方法的获取和执行
- Java利用反射,将字符串拼成方法并执行
- Java 反射获取类详细信息的常用方法总结
- java反射执行pojo中的set/get方法
- java 反射获取属性值 方法
- 黑马程序员--Java基础加强--14.利用反射操作泛型III【解析关于泛型类型的细节信息的获取方法】【Method与泛型相关的方法】【个人总结】
- Java中用反射的方式获取类中的所有属性和方法,以及获取属性的默认值,设置属性的默认值
- php反射API 获取属性/注释/方法 执行方法 实例
- Java反射代码--06.执行所有特定的set方法
- 浏览:994 Java反射代码--04.得到指定的方法,并且执行此方法!
- javassist:增强型的java反射工具,获取方法参数名,获取方法参数标注值
- javassist:增强型的java反射工具,获取方法参数名