反射:
反射就是把java类中的各种成分映射到成相应的java类
一个类的组成部分是:成员变量,方法,构造方法,包等等信息,这些信息都可以用类来表示。
表示java类的Class类提供了一些方法来获取其中的变量,方法,构造方法,修饰符,包等信息,
这些信息同时也是相应的类,Field表示成员,Method 表示方法,Contructor表示构造方法,Package表示包等等。
获取到类中成员的类后,可以可以用相应成员类的方法来调用相应的成员变量,方法或构造函数等等。
Class类
Class类表示类的字节码文件,每一个类都有对应的字节码文件,
获取类的字节码文件方法
Class 类名.class
Class 对象.geClass()
Class forName("类名");
反射构造方法
Constructor类表示ava中的构造方法的类
在Class类中有一个getConstructor()方法,获取构造方法
因为每一个类都有对应的Class类,所以可通过此方法获取构造方法,当类中存在多个构造方法时,就需要指定构造参数列表,这里的参数列表指的是参数类型的字节码。
获取发哦构造方法之后,可以通过newInstance(参数列表)方法创建实例对象。注意:这里返回值是Object 需要强制转换成对应类型。
例如:
class Student
{
private String name;
private int age;
Student(){};
Student(String name,int age){
this.name=name;
this.age=age;
}
Student(String name){}
public String toString()
{
return name+"::"+age;
}
}
class Demo
{
public static void main(String[] args)
{
//在这里获取Student类的构造方法
//首先获取Student的字节码
Class clazz=Student.class;
Constructor constructor=clazz.getConstructor();//获取空参数的构造方法
Student stu1=(Student)constructor.newInstance();//创建对象
Constructor constructor2=clazz.getConstructor(String.class,int.class)//获取参数类型为String,int的构造方法。
Student stu1=(Student)constructor.newInstance("wangqi",34);//创建对象,强制转换类型
Constructor constructor3=clazz.getConstructor(String.name)//获取参数类型为String的构造方法
Student stu1=(Student)constructor.newInstance("asdf");//创建对象强制转换类型
}
}
反射成员
Field表示类中成员的类,Class中有一个getField的方法获取成员变量
同样首先要获取到相应类的字节码文件对象,因为它是代表某个类上的变量。
获取到对象的子节码后调用getField()返回一个成员变量,getFields()返回一个Field[]数组
反射非私有化变量时,可使用上面的方法,
当反射私有成员时利用上面的方法机会报错,需要用到getDeclaresField()获取Field,当药用到Field时需要设置,setAccessible(true);(称为暴力反射)
结合上面的例子,反射出Student的成员变量
Student stu=(Student)Student.getConstructor(String.class,int.class).newInstance("wq",22);
Field[] fields=stu.getClass().getFields();
for(Field field:fields)//遍历该类所有成员变量
{
System.out.println(field.get(stu));//打印结果为wq,22;
}
方法的反射
Method表示类中的方法
反射方法,首先要获取类的字节码文件对象。通过getMethod(String name Class primiteType)方法,返回Method对象啊。
获取懂Method对象后,调用invoke(参数列表)方法调用该方法。
注意:getMethod(参数列表),该方法的参数列表是传递的方法名,和方法参数的类型的字节码
调用方法时用invoke(参数列表)此参数列表指定的是调用此方法的对象,和实际参数。
还是上面的例子:
反射toString方法
Method method=s.getClass().getMethod("toString", null);获取方法,传递方法名和参数类型
String str=method.invoke(s,null)//调用方法传递对象,和方法
System.out.println(str);//打印结果为wangqi::22
浙公网安备 33010602011771号