java反射
1,反射:
动态获取类的信息,以及动态调用对象的方法的属性、方法、接口、构造参数等。(可暴力破解类的私有信息)
①在运行时判断任意一个对象所属的类;
②在运行时构造任意一个类的对象;
③在运行时判断任意一个类所具有的成员变量和方法;
④在运行时调用任意一个对象的方法;
⑤生成动态代理。
java反射机制的功能强大随处可见,java.lang.reflect包中提供了对该功能的支持。
2.反射获取类的三种方法
//第一种:Class.forName(“包+类名”)
Class cl=Class.forName("com.zhangzhi.Student");
//第二种,创建对象getClass()方法 实例对象.getClass();
Class c2=new Student.getClass();
//第三种方式,类名.class
new Student.class;
java反射主要的功能:
具体的示例:
package com.zhangzhi.Myreflect;
public class Student implements Myinterface {
// 接口没用只是让演示一下获取
private String name="4";
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("来了老弟");
this.name = name;
}
@Override
public String toString() {
return "Student [name=" + name + "]";
}
}
package com.zhangzhi.Myreflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class InstanceTest2 {
public static void main(String[] args) throws Exception {
// 三种获取类的方法
// Class cl=Class.forName("com.zhangzhi.Student"); (“包+类名”)
//第二种,创建对象getClass()方法 实例对象.getClass();
// Class c2=new Student.getClass();
//第三种方式,类名.class
// new Student.class;
Student student = new Student();
Class stuCls = Class.forName("com.zhangzhi.Myreflect.Student");
Method method = stuCls.getDeclaredMethod("setName", String.class);
method.setAccessible(true);//暴力破解方法
// 属性和方法都是带着Declared是所有的不带Declared是public
// 本人打一般喜欢Declared 下面在暴力破解
Field field = stuCls.getDeclaredField("name");
field.setAccessible(true);//暴力破解
System.out.println(field.get(student));
// 以上是获取属性
Student stu = (Student) stuCls.newInstance();
// newInstance 是类对象
method.invoke(stu, "你好兄弟");//invoke是传值
// 以上是方法
Constructor cst2 = stuCls.getConstructor();
Student obj2 = (Student) cst2.newInstance();
System.out.println(obj2);
// 以上是构造
Class[] interfaces = stuCls.getInterfaces();
for (Class class1 : interfaces) {
System.out.println(class1);
}
// 以上是获取接口
String name = stuCls.getName();
Package package1 = stuCls.getPackage();
Student mystu = (Student) stuCls.newInstance();
// newInstance 是类对象上面有
System.out.println("全额限定名"+name+"bao名"+package1);
}
}
这里提一下:setAccessible(true) 是暴力破解,可读取到private的方法和属性