版权声明:尊重原创,码字不易,转载需博主同意。 https://blog.csdn.net/qq_34626097/article/details/84935849
Java 反射机制的应用实例
1. Java Reflection
- Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性和方法
2. Java 反射机制提供的功能
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判断任意一个类所具有成员变量和方法
- 在运行时调用任意一个对象的成员变量和方法
- 生成动态代理
3. Java反射机制研究及应用
- java.lang.Class:代表一个类
- java.lang.reflect.Method:代表类的方法
- java.lang.reflect.Field:代表类的成员变量
- java.lang.reflect.Constructor:代表类的构造方法
- 等。。。
4. dome
public class TestReflection {
//有了反射,可以通过反射创建一个类对象,并调用其中的结构
@Test
public void test2() throws Exception {
Class<Person> clazz = Person.class;
//1.创建clazz对应的运行时类Person类的对象
Person p = clazz.newInstance();
System.out.println(p);// null 0
//2.通过反射调用运行时类的指定属性
//2.1
Field f1 = clazz.getField("name");
f1.set(p, "LiuDeHua");
System.out.println(p);//Person [name=LiuDeHua, age=0]
// Field f2 = clazz.getField("age");//java.lang.NoSuchFieldException: age,如果age的权限修饰符不为public
// f2.set(p, 30);
// System.out.println(p);
//2.2
Field f2 = clazz.getDeclaredField("age");
f2.setAccessible(true);//修改set的权限,如没有修改,会报没有权限的错误
f2.set(p, 30);
System.out.println(p);//Person [name=LiuDeHua, age=30]
//通过反射调用运行时类的指定方法
Method m1 = clazz.getMethod("show");//方法名和参数确定一个方法
m1.invoke(p);
Method m2 = clazz.getMethod("display", String.class);
m2.invoke(p, "HK");
}
//在有反射以前,如果创建一个类的对象,并调用其中的方法、属性
@Test
public void test1() {
Person p = new Person();
p.setAge(20);
p.setName("Tom");
System.out.println(p);
p.show();
p.display("US");
}
}
public class Person {
//2.打开一权限
public String name ;
private int age;
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void show () {
System.out.println("我是一个人");
}
public void display(String nation) {
System.out.println("我的国籍是:" + nation);
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
- 输出