先说一下反射的定义,java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性。目前反射机制也是java语言独有的。
方法中setAccessible(true);的意思是允许调用私有的构造方法,所以在一些使用单例模式的程序中要注意防范这种反射的攻击。
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对任意一个对象,都能够调用它的任意一个方法,这种动态获取的以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能,在运行时判定任意一个对象所属的类,在运行时构造任意一个类的对象,在运行时判定任意一个类所具有的成员变量和方法,在运行是调用任意一个对象的方法,生成多态代理。
package com.lesson.java;
/**• 学生类
• @author Think
•
*/
public class Student{
private Integer age = 16;//私有封装年龄
public String name = "13";//名字
/**
* 无参的构造函数
*/
public Student(){}
/**
* 有参的构造函数
*/
public Student(Integer age,String name){
this.age=age;
this.name=name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void name1() {
System.out.println("名字:"+getName()+"年龄:"+getAge());
System.out.println("java反射成功!");
}
private void show() {
System.out.println("私有的方法");
}
}
package com.lesson.java;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Scanner;
public class Test {
// 将异常全部抛出
public static void main(String[] args)
throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException,
IllegalArgumentException, InvocationTargetException, NoSuchFieldException, IllegalAccessException {
Scanner input=new Scanner(System.in);
System.out.println("请输入你要解绑的类");
String nameString=input.next();
// 创建一个class对象
Class<?> aclass = Class.forName(nameString);// 包名加类名
// 创建方法对象
Method method1 = aclass.getDeclaredMethod("name1");
Method method2=aclass.getDeclaredMethod("show");
// 通过newInstance方法转换
// 需要转成object对象,因为在运行时不可以运行aclass
Object obj1 = aclass.newInstance();
Object obj2=aclass.newInstance();
//解除私有的方法
method2.setAccessible(true);
// 再通过方法名点invoke方法输出
method1.invoke(obj1);
method2.invoke(obj2);
// 获取方法的方法和获取字段的方法是分开的
// 输出公有字段直接输出
Field field = aclass.getField("name");
// 私有字段需要解开封装
Field fi = aclass.getDeclaredField("age");
fi.setAccessible(true);// 解开封装需要的方法
System.out.println(fi.get(obj1));
System.out.println(field.get(obj1));
}
}
package com.lesson.java;
import java.lang.reflect.Constructor;
//import java.lang.reflect.Field;
/**
• 反射测试类
•
• @author Think
•
*/
public class TextReflect {
public static void main(String[] args) throws Exception {
try {
// 类创建好后,在测试类中可以使用Class.forName("类的路径名");
// 来创建学生对象,输出学生对象的姓名和年龄
Class<?> cls = Class.forName("com.lesson.java.Student");
// 也可以通过使用getConstructor方法得到构造对象Constructor,然后通过constructor.newInstance();方法得到对象
Constructor<?> constructor = cls.getConstructor(Integer.class, String.class);
//将上面获取到的对象用obj保存起来
Object obj = constructor.newInstance(20, "小明");
if (obj instanceof Student) {
//强转
Student stu = (Student) obj;
stu.setAge(10);
stu.setName("小明");
stu.name1();
System.out.println("姓名是:" + stu.getName() + ",年龄是" + stu.getAge());
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}