反射
概念:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.
1获取class的Class实例三种方式:
方法一:通过class的静态变量 类名.class
Class cls = String.class;
方法二:通过实例变量 对象.getClass()
String s = "Hello";
Class cls = s.getClass();
方法三:如果知道一个class的完整类名,可以通过静态方法 Class.forName() 获取【常用】
Class cls = Class.forName("java.lang.String");
–
2获取class的构造方法【Constructor类】
getConstructor(Class…<?> parameterTypes) 获得该类中与参数类型匹配的public构造方法
getConstrutors() 获得类的所有public类型的构造方法
getDeclaredConstructor(Class…<?> parameterTypes) 获得该类中与参数类型匹配的构造方法
getDeclaredConstructors() 获取类的所有构造方法
Constructor
3获取class的Field【Field类】
getField(String name) 获得public 的指定属性
getFields() 获得类所有public类型的属性
getDeclaredField(String name) 获得某个属性对象
getDeclaredFields() 获得类的所有属性
Field
–
4获取class的Method【Method类】
getMethods() 获得类的public类型的方法
getMethod(String name, Class[] parameterTypes) 获得类的特定方法,name参数指定方法的名字,parameterTypes参数指定方法的参数类型。
getDeclaredMethods() 获得类的所有方法
Method
这里的Class类型是一个名叫Class的class
public final class Class {
private Class() {}
}
例子:
1.通过反射获取Class对象的三种方式
public class hu {
public static void main(String[] arg0) {
//第一种方式
Student s=new Student();//new出Student对象,一个Class对象
Class cls=s.getClass();//获取Class对象
System.out.println(cls.getName()); //Student
//第二种方式
Class cls2=Student.class;
System.out.println(cls==cls2); //true
//第三种方式
try{
Class cls3=Class.forName("Student");//包名 类名
System.out.println(cls==cls3); //true
}catch(ClassNotFoundException e){
e.printStackTrace();
}
}
}
注意:在运行期间,一个类,只有一个Class对象产生
三种方式常用第三种,第一种和第二种需要导入类的包,依赖太强,不导包就抛编译错误。一般都第三种,一个字符串可以传入也可写在配置文件中等多种方法。
2.通过反射获取构造方式
import java.lang.reflect.Constructor;
public class Student {
public Student(){
System.out.println("公有 无参构造函数");
}
public Student(char name){
System.out.println("name "+name);
}
public Student(String _name,int _age){
System.out.println("name age"+_name+" "+_age);
}
protected Student(boolean n){
System.out.println("受保护的构造函数");
}
private Student(int _age){
System.out.println("私有构造方法"+age);
}
}
----------------------------------------------------------------
public static void main(String[] arg0) {
try{
//加载Class对象
Class cls=Class.forName("Student");
//1获取所有公有构造方法
System.out.println("获取所有公有构造方法");
Constructor[] conArray=cls.getConstructors();
for(Constructor c:conArray){
System.out.println(c);
}
//2获取所有的构造函数
System.out.println("获取所有的构造方法");
conArray=cls.getDeclaredConstructors();
for(Constructor c:conArray){
System.out.println(c);
}
}catch(ClassNotFoundException e){
e.printStackTrace();
}
}
调用方法:
获取构造方法
1)批量的方法:
public Constructor[] getConstructors():所有"公有的"构造方法
public Constructor[] getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有)
2)获取单个的方法,并调用:
public Constructor getConstructor(Class… parameterTypes):获取单个的"公有的"构造方法:
public Constructor getDeclaredConstructor(Class… parameterTypes):获取"某个构造方法"可以是私有的,或受保护、默认、公有;
3.获取成员变量并调用