5.4技术补充——反射机制
程序员文章站
2022-05-13 15:51:41
...
JAVAWEB文章索引
JAVA反射机制:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性。其可以于运行时加载、探知、使用编译期间完全未知的classes,并得知名称,获悉其完整构造(但不包括methods定义),生成其对象实体、或对其fields设值、或唤起其methods。
主要探讨的类:
类 | 描述 |
Class | 类对象,可以获取类名,父类,继承的接口 |
Constructor | 类的构造方法对象,可以获取构造方法,并用其创建该类的实例 |
Method | 类的普通方法对象,可以调用类中的普通方法 |
Field | 类的属性对象,可以得到或者设置属性值 |
为了便于演示,先构建一个Person类
package com.bean;
interface Eatable{}
public class Person implements Eatable{
private int id;
String name;
public Person() {
super();
}
public Person(int id, String name) {
super();
this.id = id;
this.name = name;
}
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;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + "]";
}
}
Class:
要构造Person类的类对象有三种方式,
Class person_class1 = Person.class;
Class person_class2 = Class.forName(“com.bean.Person”);
Class person_class3 = new Person().getClass();
由于第二种只需要字符串,依赖性更低,所以最好使用第二种。
package com.reflex;
import com.bean.Person;
public class ClassDemo {
public static void main(String[] args) throws Exception {
Class person_class = Class.forName("com.bean.Person");
System.out.println(person_class.getName());//获取全名称(包名+类名)
System.out.println(person_class.getSimpleName());//获取类名
System.out.println(person_class.getSuperclass().getSimpleName());//获取父类,再获取父类名
Class[] interfacesArr = person_class.getInterfaces();
for (Class interf : interfacesArr) {
System.out.println(interf.getSimpleName());
}
}
}
运行结果:
com.bean.Person
Person
Object
Eatable
Constructor:
package com.reflex;
import java.lang.reflect.Constructor;
public class ConstructorDemo{
public static void main(String[] args) throws Exception {
//构造无参的对象
Class person_class = Class.forName("com.bean.Person");
Constructor cons1 = person_class.getConstructor(null);//获取无参的构造方法的对象
Object obj1 = cons1.newInstance(null);//通过无参的构造方法对象实例化一个对象
System.out.println(obj1.toString());
//构造有参的对象
Constructor cons2 = person_class.getConstructor(int.class, String.class);//获取有参的构造方法的对象
Object obj2 = cons2.newInstance(100, "张三");
System.out.println(obj2.toString());
}
}
运行结果:
Person [id=0, name=null]
Person [id=100, name=张三]
Method:
package com.reflex;
import java.lang.reflect.Method;
public class MethodDemo {
public static void main(String[] args) throws Exception{
Class person_class = Class.forName("com.bean.Person");
Object obj = person_class.newInstance();//获取无参构造函数实例对象的简便方法
Method setName = person_class.getMethod("setName", String.class);//通过方法名和参数类型获得该方法
setName.invoke(obj, "张三");//相当于是obj.setName("张三")
Method getName = person_class.getMethod("getName", null);
Object result = getName.invoke(obj, null);
System.out.println(result);
}
}
运行结果:
张三
Feild:
package com.reflex;
import java.lang.reflect.Field;
public class FeildDemo {
public static void main(String[] args) throws Exception{
Class person_class = Class.forName("com.bean.Person");
Object obj = person_class.newInstance();
Field name = person_class.getDeclaredField("name");//获取name属性(包括私有化)
System.out.println(name.getName()+"-"+name.getType().getSimpleName());//输出方法名和方法类型
name.setAccessible(true);//设true后可以直接操作私有化属性
name.set(obj, "张三");
System.out.println(name.get(obj));
}
}
运行结果:
name-String
张三