0
点赞
收藏
分享

微信扫一扫

java中的反射

船长_Kevin 2022-03-10 阅读 62


Java反射机制提供的功能:


  1. 在运行时判断任意一个对象所属的类
  2. 在运行时构造任意一个类的对象
  3. 在运行时判断任意一个类所具有的成员变量和方法
  4. 在运行时获取泛型信息
  5. 在运行时调用任意一个对象的成员变量和方法
  6. 在运行时处理注解
  7. 生成动态代理

反射相关的主要API


  • java.lang.Class:代表一个类 
  • java.lang.reflect.Method:代表类的方法
  • java.lang.reflect.Field:代表类的成员变量
  • java.lang.reflect.Constructor:代表类的构造器




Class类常用的方法:

方法名

功能说明

static Class forName(String name)

返回指定类名 name 的 Class 对象

Object newInstance()

调用缺省构造函数,返回该Class对象的一个实例

getName()

返回此Class对象所表示的实体(类、接口、数组类、基本类型或void)名称

Class getSuperClass()


Class [] getInterfaces()


ClassLoader getClassLoader()


Class getSuperclass()


Constructor[] getConstructors()


Field[] getDeclaredFields()


getMethod(String name,Class … paramTypes)


有一个Person类如下: 

public class Person {
private String name;
private String age;
//构造方法
public Person(String name, String age) {
this.name = name;
this.age = age;
}
public Person() {
}


//get set方法啊
public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getAge() {
return age;
}

public void setAge(String age) {
this.age = age;
}
//toString方法

@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
}

以前是通过new创建一个实例,然后通过实例修改属性或者调用方法。现在呢可以通过反射操作 

反射示例:

反射构造实例:

Class clazz = Person.class;
//1.通过反射,创建Person类的对象
Constructor cons = clazz.getConstructor(String.class,int.class);
Object obj = cons.newInstance("Tom", 12);
Person p = (Person) obj;
System.out.println(p.toString());

调用属性 

//调用属性
Field age = clazz.getDeclaredField("age");
age.set(p,10);
System.out.println(p.toString());

调用public方法 

//调用方法
Method show = clazz.getDeclaredMethod("show");
show.invoke(p);

System.out.println("*******************************");

除此之外还可以通过反射来调用private方法和private属性(原来做不到,反射可以做) 

调用私有构造器 

//通过反射,可以调用Person类的私有结构的。比如:私有的构造器、方法、属性
//调用私有的构造器
Constructor cons1 = clazz.getDeclaredConstructor(String.class);
cons1.setAccessible(true);
Person p1 = (Person) cons1.newInstance("Jerry");
System.out.println(p1);

调用私有属性 

//调用私有的属性
Field name = clazz.getDeclaredField("name");
name.setAccessible(true);
name.set(p1,"HanMeimei");
System.out.println(p1);

调用私有的方法 

//调用私有的方法
Method showNation = clazz.getDeclaredMethod("showNation", String.class);
showNation.setAccessible(true);
String nation = (String) showNation.invoke(p1,"中国");
//相当于String nation = p1.showNation("中国")
System.out.println(nation);




举报

相关推荐

0 条评论