一,
反射基本概念:
反射机制是在【运行状态】中可以获取一个类的所有属性,和方法(包括构造器)并且能够调用其任意一个方法和属性。
反射常用功能大致如下:
- 在运行期间获取任意一个对象的所属类
- 在运行期间构造任意一个类的对象
- 在运行期间获取一个类所具有的所有公共,私有的成员变量和方法
- 在运行期间可以调用某个类的任意一个方法,构造方法
提示:我们所知道的有点高端的动态代理的底层支持其实就是反射
二,
获取类的三种方式:
代码片段中分割线表示另一个文件,另外代码片段接近伪代码没有什么实际业务做铺垫。
Order order = new Order();
/**
* Class.forName() 根据全类名构造一个Class
* 对象通过调用 getClass() 方法获取其Class
* .class 是一个特殊语法,获取当前类在JVM生成的Class
*/
public Order(){
Syste.out.println("无参构造");
}
private Order(String name){
System.out.println(name);
}
Class classThree = Class.forName("cn.entity.Order");
Class classOne = order.getClass();
Class classTwo = Order.class();
======================================================================================
package cn.entity
public class Order implements Service,IService{
private String name;
private int age;
private char gender;
public void setName(String name){ this.name = name; }
public String getName(){ return name; }
public void setAge(int age){ this.age = age; }
public int getAge(){ return age; }
public void setGender(char gender){ this.gender = gender; }
public char getGender(){ return gender; }
@Override
public void orderGeneral(){
}
@Override
public void orderManager(){
}
}
======================================================================================
public interface Service{
void orderGeneral();
}
=======================================================================================
public interface IService{
void orderManager();
}
获取方法,构造方法,接口,父类:
/**
* 获取所有的公共方法(当前类、父类以及接口中所有公共修饰的方法)
*/
Method[] methods = classOne.getMethos();
for(Method method:methods){
System.out.println(method);
}
=========================================================================================
/**
* 获取所有构造方法
*/
Constructor<?>[] constructors = classOne.getConstructors();
for(Constructor constructor:constructors){
System.out.println(constructor);
}
=========================================================================================
/**
* 获取所有接口
*/
Class<?>[] interfaces = classOne.getInterface();
for(Class<?> inteface:interfaces){
System.out.println(interfaces);
}
=========================================================================================
/**
* 获取所有父类
*/
Class<?> superClass = classOne.getSuperClass();
System.out.println(superClass);
=========================================================================================
/**
* 获取所有公共属性
*/
Field[] fields = classOne.getFields();
for(Field field:fields){
System.out.println(field);
}
=========================================================================================
/**
* 获取当前类所有方法
*/
Method[] methods = classOne.getDeclaredMethods();
for(Method method:methods){
System.out.println(method);
}
=========================================================================================
/**
* 获取当前类所有属性
*/
Field[] fields = classOne.getDeclaredFields();
for(Field field:Fileds){
System.out.println(field);
}
获取并操作对象:
/**
* 获取 class 对象并强转,调用该对象的方法
*/
Order order = (Order)classOne.newIstance();
order.setName("阿狗");
order.setAge("10");
order.setGender('男');
=========================================================================================
/**
* 操作某个属性
* 下面代码中 nameField.setAccessible(true) [默认值为 false] 作用是:
* 忽略 name 属性的访问修饰符
*/
Order order = (Order)classOne.newInstance();
Field nameField = classOne.getDeclaredField("name");
nameField.setAccessible(true);
nameField.set(order,"阿狗");
System.out.println(order.getName());
=========================================================================================
/**
* 调用无参方法,DeclaerdMthod 参数列表:1.方法名(String) 2.参数类型(class)
* 方法名参数将方法名的字符串传入,参数类型 由于是无参方法传入 null 即可
*/
Order order = (Order)classOne.newInstance();
Method method = classOne.getDeclaredMethod("getName",null);
method.invoke(order,null);
=========================================================================================
/**
* 调用有参方法,DeclaredMthod 参数列表: 1.方法名(String) 2.参数类型(class);
* 方法名参数将方法名的字符串传入,参数类型需要 类型class;比如: int.class String.class
*/
Order order = (Order)classOne.newInstance();
Method method = classOne.getDeclaredMethod("setName",String.class);
method.invoke(order,"阿狗");
=========================================================================================
/**
* 有参构造 和 无参构造
* getDeclaredConstructor() 获取所有的构造函数 、
* getConstructor() 获取公共构造函数
*/
Constructor constructor = classOne.getDelcaredConstructor(String.class); //有参构造
constructor.setAccessible(true);
Order order = (Order)constructor.newInstance("阿狗");
Constructro constructor = classOne.getContructor(); //无参构造
Order order = (Order)constructor.newInstance();
说明:上面代码获取有参构造函数使用了getDecalerdConstructor(),因为有参构造函数是一个私有的;
获取无参构造使用了getConstructor(),因为无参构造函数是公共的。
注意:上面代码中setAccessible()函数只是作为一个了解,实际开发中不建议使用。
文章是我自己个人的一点总结,所以本文会持续更细;读者如发现有错误或者不合理的地方欢迎指出