反射
在Java中,每一个类产生一个.class文件,产生一个class对象。反射就是我们拿到这个class对象,通过反射来获取类的信息。
(注:Class对象:任何一个 类都有一个class隐含的静态成员变量class,这个class就指向JVM中的那个类的class。)
1,三种获取class对象的方法
Student s1 = new Student();
//1.s1.getClass()
Class c1 = s1.getClass();
//2.直接通过 类名.class 安全可靠
//说明任何一个类都有一个隐含的静态成员变量 class
Class c2 = Student.class;
//通过 Class 对象的 forName() 静态方法来获取
//可能要抛出异常ClassNotFoundException
Class c3 = Class.forName("com.tulun.src.Student");
一个类型 对应一个Class对象---》类型一一对应的
System.out.println(c1.equals(c2));
System.out.println(c1.equals(c3));
System.out.println(c3.equals(c2));
2,class的一些方法
查阅 API 可以看到 Class 有很多方法:
getName():获得类的完整名字。
getFields():获得类的public类型的属性。
getDeclaredFields():获得类的所有属性。包括private 声明的和继承类
getMethods():获得类的public类型的方法。
getDeclaredMethods():获得类的所有方法。包括private 声明的和继承类
getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,
parameterTypes 参数指定方法的参数类型。
getConstructors():获得类的public类型的构造方法。
getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。
newInstance():通过类的不带参数的构造方法创建这个类的一个对象。
(1)getName()
String name1 = c1.getName();
System.out.println(name1);
(2)getField()获取类的public属性
Field[] f1 = c1.getFields();
System.out.println(Arrays.toString(f1));
(3)//getDeclaredMethods() 获取类的所有方法
Method[] m = c1.getDeclaredMethods();
System.out.println(Arrays.toString(m));
(4)//getConstructors() 获取类的public构造方法
Constructor[] c = c1.getConstructors();
System.out.println(Arrays.toString(c));
3,反射的不安全之处
可以获取类的私有属性并进行更改!!!
Field f = c1.getDeclaredField("name");
f.setAccessible(true);//通过这一句给其设置了可见性
Object p = c1.newInstance();//获取此类的一个对象
f.set(p, "haha");//改变原来的私有属性