关于反射的举例:
示例代码: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.获取所有构造器,无论是否是public
Constructor<?>[] 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. 根据参数获取所有构造器,无论是否是public
Constructor<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("********************");
// 获取所有的成员变量,无论是否是public
Field[] 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框架,基本上,主流的框架都会基于反射设计一些通用的功能。