有人说希斯莱杰演出了最棒的小丑,也有人说杰昆菲尼克斯的小丑演的最入神,实际上我们都知道,是你,我的朋友,当你出场的时候我们都被你戏剧性的表演逗笑了,你才是当之无愧的小丑。
Java反射
什么是Java反射
反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并
且对内部的成员进行操作。反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法
,对于任意一个对象,都能够调用它的任意方法和属性,这种动态获取信息以及动态调用对象方法的功能称为
java语言的反射机制。
那么通过这样的说法直接来获取一个概念非常抽象,但是我们假如存在这样一个场景,存在着这样一个Person类,存在两个属性,一个public属性和一个private属性,并且已经定义了参数,我们需要在代码运行的过程中去修改这两个属性的参数,就可以通过反射的方法直接进行调用。
这里同时也提到在不同类中调用私有属性的一些方式:
1.在含私有属性的类中创建公有方法进行操作。
2.通过反射进行操作。
1 2 3 4 5 6 7 8 9 10
| public class Person { public String name = "小明"; private int age = 28; public String getName(){ return name; } public int getAge(){ return age; } }
|
直接通过实例化对象的方式。直接创建对象打印结果,且这种方法无法直接对私有属性进行调用,而反射则可以解决这一问题。
1 2 3 4 5 6 7
| public class Main { public static void main(String[] args){ Person person = new Person(); System.out.println(person.getName()); System.out.println(person.getAge()); } }
|

这里体现了反射的用处,我们可以在没有setter方法的情况下对一个类中的属性进行操作,当然,反射也可以对类中的其他方法进行操作、解决一些类无法进行序列化反序列化等问题,这个在之后碰到了会进行实际补充。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| import java.lang.reflect.Field;
public class Main { public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { Person person = new Person(); System.out.println(person.getName()); System.out.println(person.getAge());
System.out.println("************反射***************"); Class p = Person.class; Field namefield = p.getField("name"); namefield.set(person, "小红"); Field agefiled = p.getDeclaredField("age"); agefiled.setAccessible(true); agefiled.set(person, 30);
System.out.println(person.getName()); System.out.println(person.getAge()); } }
|

反射中的一些常见操作
1 2 3 4 5 6 7 8 9 10 11 12 13
| Class<?> clazz = SomeClass.class;
String className = clazz.getName();
Class<?> superClass = clazz.getSuperclass();
Class<?>[] interfaces = clazz.getInterfaces();
Constructor<?>[] constructors = clazz.getConstructors();
Method[] methods = clazz.getMethods();
Field[] fields = clazz.getFields();
|