反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象。
1.1 Class类
获取Class对象的三种方式
package com.oracle.FanShe;
public class Demo01 {
public static void main(String[] args) throws ClassNotFoundException {
//1.通过getClass方法获取,通过对象获取
Person p=new Person();
Class c1=p.getClass();
System.out.println(c1);
//2.通过类名获取
Class c2=Person.class;
System.out.println(c2);
System.out.println(c1==c2);
System.out.println(c1.equals(c2));
//3.通过完整的包名+类名
Class c3=Class.forName("com.oracle.FanShe.Person");
System.out.println(c3);
}
}
package com.oracle.FanShe;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.jar.Attributes.Name;
public class Demo02 {
//构造方法Constructor
//成员变量 Field
//方法 Method
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
//反射获取构造方法
//获取Person.class文件对象
Class c=Class.forName("com.oracle.FanShe.Person");
/*//获取所有公共的构造方法(构造方法数组)
Constructor[] cons=c.getConstructors();
//遍历
for(Constructor con:cons){
System.out.println(con);
}*/
//获取某个公共构造方法
//空参构造
/*Constructor con1=c.getConstructor();
//System.out.println(con1);
//有参构造
Constructor con2=c.getConstructor(String.class,int.class);
//System.out.println(con2);
//创建你对象
Object obj= con2.newInstance("乔治",16);
System.out.println(obj);*/
//获取 所有的构造方法数组
/*Constructor[] cons=c.getDeclaredConstructors();
for(Constructor con:cons){
System.out.println(con);
}*/
//获取某个私有构造方法
Constructor con=c.getDeclaredConstructor(String.class);
//System.out.println(con);
//暴力反射
con.setAccessible(true);
Object obj=con.newInstance("拉拉");
System.out.println(obj);
}
}
package com.oracle.FanShe;
public class Person {
private String name;
public int age;
static{
System.out.println("静态代码块");
}
public Person(){
System.out.println("空参构造");
}
public Person(String name, int age){
this.name=name;
this.age=age;
System.out.println("public Person(String name, int age)");
}
public Person(String name){
this.name=name;
System.out.println("public Person(String name)");
}
public void eat(){
System.out.println("公共空参方法");
}
public void sleep(String name){