关于反射的举例:
示例代码:Fan.java
package testFanShe;/*** @author: Arbicoral* @Description: 测试反射:* 成员变量:2个public,2个private* 构造器:4个public,2个private* 成员方法:1个private,1个public*/
public class Fan {private String name;private int age;public String address;public String say;public Fan() {}private Fan(String name) {this.name = name;}public Fan(String address, String name) {this.address = address;this.name = name;}private Fan(boolean isMarried,String address){this.address=address;}public Fan(String name, int age) {this.name = name;this.age = age;}public Fan(String name, int age, String address, String say) {this.name = name;this.age = age;this.address = address;this.say = say;}public void show(){System.out.println("我是反射...");}private void run(){System.out.println("running...");}
}
通过反射获取 Fan.java中的成员变量、成员方法、构造器等成分。
TestFan.java
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Member;
import java.lang.reflect.Method;/*** @author: Arbicoral* @Description: 测试 Fan类*/
public class TestFan {private static Class<Fan> fanClass;public static void main(String[] args) throws Exception {// -------------- 一、获取Class对象的三种方式:Class对象---------------------// 方式 1.获取class对象fanClass = Fan.class;// 方式 2. 调用Class提供的方法:public static Class<?> forName(String className)Class<?> aClass = Class.forName("testFanShe.Fan");// 方式 3. Object提供的方法:public final native Class<?> getClass();// Class c3=对象.getClass();Fan fan = new Fan();Class<? extends Fan> aClass1 = fan.getClass();// -------------- 二、获取类的构造器:Constructor对象---------------------// 2.获取全部public构造器Constructor<?>[] constructors = aClass.getConstructors();for (Constructor constructor:constructors){// 获取构造器的名字和构造器中参数的个数System.out.println(constructor.getName()+"-->"+constructor.getParameterCount());}System.out.println("=============");// 3.获取所有构造器,无论是否是publicConstructor<?>[] declaredConstructors = fanClass.getDeclaredConstructors();for (Constructor dc:declaredConstructors){System.out.println(dc.getName()+"-->"+dc.getParameterCount());}System.out.println("********************");// 4. 根据参数获取public构造器Constructor constructor = fanClass.getConstructor(String.class, int.class);System.out.println(constructor.getName()+"-->"+constructor.getParameterCount());System.out.println("-----------------");// 5. 根据参数获取所有构造器,无论是否是publicConstructor<Fan> dc = fanClass.getDeclaredConstructor(boolean.class, String.class);dc.setAccessible(true);// dc.newInstance();System.out.println(dc.getName()+"-->"+dc.getParameterCount());System.out.println("********************");// -------------- 三、获取类的成员变量:Field对象---------------------// 获取全部public的成员变量Field[] fields = fanClass.getFields();for (Field f:fields){System.out.println(f.getName());}System.out.println("********************");// 获取所有的成员变量,无论是否是publicField[] declaredFields = fanClass.getDeclaredFields();for (Field f:declaredFields){System.out.println(f.getName());}// -------------- 四、获取类的成员方法:Method对象---------------------// 获取全部public的成员方法System.out.println("********************");Method[] methods = fanClass.getMethods();for (Member m:methods){System.out.println(m.getName());}System.out.println("********************");for (Method declaredMethod : fanClass.getDeclaredMethods()) {System.out.println(declaredMethod.getName());}}
}
总结:
反射的作用:
- 基本作用:可以得到一个类的全部成分,然后进行操作;
- 可以破坏封装性;
- 适合做Java框架,基本上,主流的框架都会基于反射设计一些通用的功能。