概念比较清楚的理解如下,来源于:https://www.cnblogs.com/shiwanming/p/9821577.html
首先我要简单的来说一下什么是Java的反射机制:
在Java里面一个类有两种状态--编译和运行状态,通常我们需要获取这个类的信息都是在编译阶段获得的,也就是直接点出来或者new出来,可是如果需要在类运行的阶段获得Java的类的信息的话,
就需要用到Java的反射。
概念就是这个,但我还是不知道反射到底有什么用。到底有什么用呢?
Java的反射用的最多的地方就是在框架里面。先举个例子,比如说有两个程序员,他们俩个都在创建两个类,第一个程序员现在需要第二个程序员创建的类,可是现在第二个程序员创建的类还没有完成。问:现在第一个程序员可以成功编译吗?
答案当然是不行的,可是现在第一个程序员又需要第二个程序员的类,这个时候,反射就可以完成这种想法。因为反射是在类运行的时候获取对象的各个信息,所以第一个程序员的类就可以完成编译了。
这就是Java反射的一个小概念,实际应用中当然是有很复杂的效果啦。
基本操作:
Class<?> class1 = Demo2Application.class;//通过getclass()获取 Class<?> class2 = new Demo2Application().getClass();//通过getclass()获取 Class<?> class3 = Class.forName("com.example.demo2.Demo2Application");//通过类名获取 /* System.out.println(class1);//所以结果是 class com.reflect.ReflectDemo System.out.println(class1.toString());//所以结果是 class com.reflect.ReflectDemo System.out.println(class1.getName());//所以结果是 com.reflect.ReflectDemo System.out.println(class1.getSimpleName());//所以结果是 ReflectDemo System.out.println(class1.getModifiers());//所以结果是 1 Class<?> superclass = class1.getSuperclass(); System.out.println(superclass);//所以结果是 class java.lang.Object */ Constructor<?>[] constructors = class3.getConstructors(); for (Constructor<?> constructor : constructors) { System.out.println(constructor); } System.out.println("// 2. 获取本类所有的 声明的构造器对象 "); constructors = class3.getDeclaredConstructors(); for (Constructor<?> constructor : constructors) { System.out.println(constructor); } System.out.println("// 3. 获取单个的 公共的构造器对象 "); Constructor<?> constructor = class3.getConstructor(String.class,int.class,boolean.class); System.out.println(constructor); System.out.println("// 4. 获取单个的 本类声明的构造器对象 "); Class<?>[] cs = {String.class}; constructor = class3.getDeclaredConstructor(cs); System.out.println(constructor); Parameter[] parameters = constructor.getParameters(); for (Parameter parameter : parameters) { System.out.println(parameter); } System.out.println("1. 操作无参构造器 "); constructor = class3.getDeclaredConstructor(); // 获得无参的构造器 Object instance = constructor.newInstance(); // 创建对象 System.out.println(instance); System.out.println("2. 操作有参构造器 "); constructor = class3.getDeclaredConstructor(String.class ,int.class , boolean.class); instance = constructor.newInstance("二狗",18,true); System.out.println(instance); System.out.println("3. 操作无权限的构造器 "); constructor = class3.getDeclaredConstructor(String.class); constructor.setAccessible(true); // 暴力反射 instance = constructor.newInstance("狗蛋"); System.out.println(instance); System.out.println("// 1. 获取本类所有的 公共的属性对象 包含父类的公共属性"); Field[] fields = class3.getFields(); for (Field field : fields) { System.out.println(field); } System.out.println("2. 获取所有的本类声明的方法对象 不包括父类的"); Method[] methods = class3.getMethods(); methods = class3.getDeclaredMethods(); for (Method method : methods) { System.out.println(method); } System.out.println("// 3. 获取本类公共的单个的属性对象 包括继承到的"); Field field = class3.getField("str"); System.out.println(field); System.out.println(" 属性对象的基本操作 "); field = class3.getDeclaredField("str"); System.out.println(field.getType());// 获取属性类型的 类对象 System.out.println(field.getName()); System.out.println(field.getModifiers());