java的常用技术–反射的详解
一.反射的介绍
反射:java的反射机制时在java的运行状态中,对于任意一个类都能够知道这个类的所有属性盒方法,也都能够调用他的属性盒方法.这中动态获取信息或者动态使用属性和方法就叫做 java的动态反射机制(其实就是说在开发中,我们可以通过反射获取我们想要获得的各种信息,属性盒方法)
二.我们使用反射机制都能够进行哪些使用?
- 获取类的反射的三种方法:
public class Test1 {
public static void main(String[] args) throws Exception {
//获取的三种方法
//1.
Class c = Class.forName("com.zyx.demo.Person");
//2.
Person p=new Person();
Class c1 = p.getClass();
//3.
Class c2=Person.class;
}
2.获取该类中所有的方法
Class c2=Person.class;*/
//获取类中所有的公共的方法
Method[] methods = c.getMethods();
for (Method method : methods) {
System.out.println(method);
}
运行后的结果:
(person类的自己的方法)
public static void com.zyx.demo.Person.update()
public java.lang.String com.zyx.demo.Person.getName()
public void com.zyx.demo.Person.read()
public java.lang.String com.zyx.demo.Person.getId()
public void com.zyx.demo.Person.setName(java.lang.String)
public void com.zyx.demo.Person.setAge(java.lang.String)
public void com.zyx.demo.Person.setId(java.lang.String)
public java.lang.String com.zyx.demo.Person.getAge()
(object父类的方法)
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
3.获取所有实现的接口:getInterfaces()
4.获取父类:getSuperClass
5.获取类中所有的构造函数:getConstrustors
6.获取类中所有的属性
//获取类中所有的属性
Field[] fields = c.getDeclaredFields();
for (Field field : fields) {
System.out.println(field);
}
7.创建类的实例化 本质上就是new了一个对象 newInstance()
//创建类的实例化
Object obj = c.newInstance();
//强转 向下转型
Person p=(Person)obj;
System.out.println(p);
8.getDeclaredFields 和 getFields的区别
getDeclaredFields: 是获得某个类的所有申明的字段,既包括 public private protected 但是 不包含父类的字段
get Fieleds 获取所有类的公共字段 public 包括父类
二通过反射获取对象实例,然后操作对象
// 创建类的实例化
Object obj = c.newInstance();
// 强转 向下转型
Person p = (Person) obj;
p.setAge("11");
p.setId("12");
p.setName("123");
System.out.println("id=" + p.getId() + "name=" + p.getName() + "age=" + p.getAge());
通过反射获取字段属性,并且赋值
//获取 age属性
Field field = c.getDeclaredField("age");
//获取类的实例化
Object obj = c.newInstance();
field.set(obj, "22");
System.out.println(field.get(obj));
如果获取的属性时私有的不能直接操作,需要进行暴力反射 setAccessible(true)
Class类提供了四个public方法,用于获取某个类的构造方法
Constructor getConstructor(Class[] params) 根据构造函数的参数,返回一个具体的具有public属性的构造函数
Constructor getConstructors() 返回所有具有public属性的构造函数数组
Constructor getDeclaredConstructor(Class[] params) 根据构造函数的参数,返回一个具体的构造函数(不分public和非public属性)
Constructor getDeclaredConstructors() 返回该类中所有的构造函数数组(不分public和非public属性)
四种获取成员方法的方法
Method getMethod(String name, Class[] params) 根据方法名和参数,返回一个具体的具有public属性的方法
Method[] getMethods() 返回所有具有public属性的方法数组
Method getDeclaredMethod(String name, Class[] params) 根据方法名和参数,返回一个具体的方法(不分public和非public属性)
Method[] getDeclaredMethods() 返回该类中的所有的方法数组(不分public和非public属性)
四种获取成员属性的方法
Field getField(String name) 根据变量名,返回一个具体的具有public属性的成员变量
Field[] getFields() 返回具有public属性的成员变量的数组
Field getDeclaredField(String name) 根据变量名,返回一个成员变量(不分public和非public属性)
Field[] getDelcaredField() 返回所有成员变量组成的数组(不分public和非public属性)