定义
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
与反射机制相关的类
Class类 代表类的实体,在运行的Java应用程序中表示类和接口
获取类相关方法:
方法 | 用途 |
---|---|
asSubclass(Class clazz) | 把传递的类的对象转换成代表其子类的对象 |
Cast | 把对象转换成代表类或是接口的对象 |
getClassLoader() | 获得类的加载器 |
getClasses() | 返回一个数组,数组中包含该类中所有公共类和接口类的对象 |
getDeclaredClasses() | 返回一个数组,数组中包含该类中所有类和接口类的对象 |
forName(String className) | 根据类名返回类的对象 |
getName() | 获得类的完整路径名字 |
newInstance() | 创建类的实例 |
getPackage() | 获得类的包 |
getSimpleName() | 获得类的名字 |
getSuperclass() | 获得当前类继承的父类的名字 |
getInterfaces() | 获得当前类实现的类或是接口 |
获得类中属性相关方法
方法 | 用途 |
---|---|
getField(String name) | 获得某个公有的属性对象 |
getFields() | 获得所有公有的属性对象 |
getDeclaredField(String name) | 获得某个属性对象 |
getDeclaredFields() | 获得所有属性对象 |
反射的三种方式
实例类:
package com.ant.cral.DTO;
public class User {
private String name;
private int age;
public User(String name,int age){
this.name=name;
this.age=age;
}
private User(String name){
this.name=name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
}
getClass()方法
User user=new User();
Class classz=user.getClass();//获取user的Class对象
Object.class方法
Class classz = User.class;//获取User类的反射
Class.foraName(url)
try{
//根据类的全路径名称获取
Class classz=Class.forName("com.ant.cral.DTO.User");//获取类的反射对象
}catch (ClassNotFoundException e){
e.printStackTrace();
}
以上三种方式获取一般推荐使用第三种通过Class.forName()方式获取
反射的使用
通过反射获取构造方法
try{
//根据类的全路径名称获取
Class classz=Class.forName("com.ant.cral.DTO.User");//获取类的反射对象
//获取所有公有构造方法
Constructor[] constructors=classz.getConstructors();
for(Constructor constructor:constructors){
System.out.println(constructor);
}
//获取所有构造方法
Constructor[] constructor1=classz.getDeclaredConstructors();
for(Constructor constructor:constructor1){
System.out.println(constructor);
}
// 根据构造方法参数类型获取公有构造方法
Constructor constructor2=classz.getConstructor(new Class[]{String.class,int.class});
// 根据构造方法参数类型获取私有构造方法
Constructor declaredConstructor=classz.getDeclaredConstructor(new Class[]{String.class});
}catch (ClassNotFoundException e){
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
通过反射获取类属性
// 根据类的全路径名称获取
Class classz=Class.forName("com.ant.cral.DTO.User");// 获取类的反射对象
Field[] fields=classz.getFields();// 获取所有公有字段
Field[] fields1=classz.getDeclaredFields();// 获取所有字段(公共、私有)
Field field=classz.getDeclaredField("name");// 获取名称为name的指定私有字段
Object o=classz.getConstructor().newInstance();// 获取一个公有构造方法并且实例化
field.set(o,"antsit");// 给通过反射实例化的对象为其name属性赋值
通过反射获取类中的方法
//根据类的全路径名称获取
Class classz=Class.forName("com.ant.cral.DTO.User");//获取类的反射对象
Method[] methods=classz.getMethods();
Method[] methods1=classz.getDeclaredMethods();
Method method=classz.getMethod("setName",String.class);
Method method1=classz.getMethod("getName");
Object o=classz.getConstructor().newInstance();//获取一个公有构造方法并且实例化
Object invoke=method.invoke(o,"antsit");//给方法传值并执行(必须实例化对象后才可执行)
通过反射执行main方法
Class classz=Class.forName("com.ant.cral.DTO.User");//获取类的反射对象
Method method=classz.getMethod("main", String[].class);//获取main方法
method.invoke(null,(Object)new String[]{"a"});//调用执行
评论区