概述
JAVA反射机制是在运行中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
每个类都会产生一个对应的Class对象,也就是保存在.class文件。所有类都是在对其第一次使用时,动态加载到JVM的,当程序创建一个对类的静态成员的引用时,就会加载这个类。Class对象仅在需要的时候才会加载,static初始化是在类加载时进行的。
Class 类与 java.lang.reflect 类库一起对反射的概念进行了支持,该类库包含了 Field,Method,Constructor 类 (每个类都实现了 Member 接口)。这些类型的对象时由 JVM 在运行时创建的,用以表示未知类里对应的成员。
使用
首先创建几个测试类和接口:
/**
* Hello world!
*
*/
public class App
{
private Integer weight;
private Integer height;
public App(Integer weight, Integer height) {
super();
this.weight = weight;
this.height = height;
}
public App() {
super();
}
@Override
public String toString() {
return "App [weight=" + weight + ", height=" + height + "]";
}
}
/*
* @author zzf
* @date 2018年11月6日 下午2:18:39
*/
public interface InterfaceA {
}
/*
* @author zzf
* @date 2018年11月6日 下午2:44:32
*/
public class U {
private String type;
public U(String type) {
super();
this.type = type;
};
public U() {
super();
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
};
}
/*
* @author zzf
* @date 2018年11月6日 上午11:00:55
*/
public class User extends U{
private String name;
private Integer age;
public App app;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public App getApp() {
return app;
}
public void setApp(App app) {
this.app = app;
}
public User(String name, Integer age, App app) {
super();
this.name = name;
this.age = age;
this.app = app;
}
public User(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
private User(String name) {
super();
this.name = name;
}
public User() {
super();
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + ", app=" + app + "]";
}
private String aaa() {
return "User [name=" + name + ", age=" + age + ", app=" + app + "]";
}
public String User(String name, Integer age, App app) {
this.name = name;
this.age = age;
this.app = app;
return toString();
}
private class P {
private String p;
public P(String p) {
super();
this.p = p;
}
public String getP() {
return p;
}
public void setP(String p) {
this.p = p;
}
}
}
测试demo:
import java.lang.reflect.*;
/*
* @author zzf
* @date 2018年11月6日 上午10:57:31
*/
public class Text {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
//返回与给定字符串名称的类或接口相关联的类对象。
//三种方式
Class user=Class.forName("reflect.User");
System.out.println(user.toGenericString());//public class reflect.User
Class app=User.class;
System.out.println(app.toGenericString());//public class reflect.User
System.out.println(new User().getClass().toGenericString());//public class reflect.User
//返回类的限定符,在toGenericString源码中可寻
int modifiers = app.getModifiers() & Modifier.classModifiers();
String s=Modifier.toString(modifiers);
System.out.println(s);//public
//创建一个User类的实例
Object userObj=Class.forName("reflect.User").newInstance();//默认构造器
System.out.println((User)userObj);//User [name=null, age=null, app=null]
//判断实例是否为该类
System.out.println(user.isInstance(new User()));//true
//是否是该class对象
System.out.println(user.isAssignableFrom(User.class));//true
//判断该反射对象是否是接口
System.out.println("接口:"+Class.forName("reflect.InterfaceA").isInterface());//true
System.out.println("类:"+Class.forName("reflect.User").isInterface());//true
//判断指定的类对象是否表示基元类型
System.out.println(int.class.isPrimitive());//true
System.out.println(User.class.isPrimitive());//false
//打印类的全限定名
System.out.println(Class.forName("reflect.User").getName());//reflect.User
System.out.println(User.class.getName());//reflect.User
//获取类加载器
System.out.println("类加载器:"+Class.forName("reflect.User").getClassLoader());//sun.misc.Launcher$AppClassLoader@18b4aac2
//获取它的超类对象
System.out.println(Class.forName("reflect.User").getSuperclass());//class reflect.U
System.out.println(Class.forName("reflect.User").getGenericSuperclass());//class reflect.U
//获取它的包名
System.out.println("包:"+Class.forName("reflect.User").getPackage());//包:package reflect
//返回类修饰符所对应的int值,在Modifier类中可寻
System.out.println(Class.forName("reflect.User").getModifiers());//1
//返回类名
System.out.println(Class.forName("reflect.User").getSimpleName());//User
System.out.println(Class.forName("java.lang.String").getSimpleName());//String
//根据类反射字段,方法,构造器等,public标识符
Field[] field=Class.forName("reflect.User").getFields();//app,
for(Field f:field)
System.out.print(f.getName()+",");
System.out.println();
Method[] method=Class.forName("reflect.User").getMethods();//toString,getName,setName,User,getAge,setAge,getApp,setApp,getType,setType,wait,wait,wait,equals,hashCode,getClass,notify,notifyAll,
for(Method f:method)
System.out.print(f.getName()+",");
System.out.println();
Constructor<?>[] constructor=Class.forName("reflect.User").getConstructors();//reflect.User|2:class java.lang.String,class java.lang.Integer,reflect.User|0:reflect.User|3:class java.lang.String,class java.lang.Integer,class reflect.App,
for(Constructor f:constructor){
System.out.print(f.getName()+"|"+f.getParameterCount()+":");
for (Parameter p:f.getParameters()){
System.out.print(p.getType()+",");
}
}
System.out.println();
//获取单个字段或者方法或者构造器,public
Field f=Class.forName("reflect.User").getField("app");//public reflect.App reflect.User.app
System.out.println(f);
Method m=Class.forName("reflect.User").getMethod("toString");//public java.lang.String reflect.User.toString()
System.out.println(m);
Constructor con=Class.forName("reflect.User").getConstructor();//User [name=null, age=null, app=null]
System.out.println(con.newInstance());
Constructor con2=Class.forName("reflect.User").getConstructor(String.class,Integer.class);//User [name=1111, age=11, app=null]
System.out.println(con2.newInstance("1111",11));
//返回所有的字段,方法,或者构造器
//返回成员类
Class<?>[] dec=Class.forName("reflect.User").getDeclaredClasses();//reflect.User$P,
for(Class text:dec)
System.out.print(text.getName()+",");
System.out.println();
Field[] fie=Class.forName("reflect.User").getDeclaredFields();//返回所有的字段:name,age,app,
for(Field text:fie)
System.out.print(text.getName()+",");
System.out.println();
Method[] met=Class.forName("reflect.User").getDeclaredMethods();//返回所有方法:toString,getName,setName,aaa,User,getAge,setAge,getApp,setApp,
for(Method text:met)
System.out.print(text.getName()+",");
System.out.println();
Constructor<?>[] cons=Class.forName("reflect.User").getDeclaredConstructors();//返回所有构造器:app|2:class java.lang.String,class java.lang.Integer,app|1:class java.lang.String,app|0:app|3:class java.lang.String,class java.lang.Integer,class reflect.App,
for(Constructor text:cons){
System.out.print(f.getName()+"|"+text.getParameterCount()+":");
for (Parameter p:text.getParameters()){
System.out.print(p.getType()+",");
}
}
System.out.println();
//返回任意字段,方法,构造器,包括私有
Field df=Class.forName("reflect.User").getDeclaredField("name");//private java.lang.String reflect.User.name
System.out.println(df);
Method dm=Class.forName("reflect.User").getDeclaredMethod("aaa");//private java.lang.String reflect.User.aaa()
System.out.println(dm);
Constructor dc=Class.forName("reflect.User").getDeclaredConstructor(String.class);//private reflect.User(java.lang.String)
System.out.println(dc);
//通过反射创建对象,使用私有构造器创建
Constructor dcc=Class.forName("reflect.User").getDeclaredConstructor(String.class);//返回构造器,包括私有
dcc.setAccessible(true);//暴力破解
Object a=dcc.newInstance("SSSSSSSSS");
System.out.println(a);//User [name=SSSSSSSSS, age=null, app=null]
//通过反射调用私有方法
Method dms=Class.forName("reflect.User").getDeclaredMethod("aaa");
dms.setAccessible(true);
System.out.println(dms.invoke(a, null));//User [name=SSSSSSSSS, age=null, app=null]
System.out.println(dms.invoke(Class.forName("reflect.User").newInstance(), null));//User [name=null, age=null, app=null]
/*************************************************/
//结合以上内容综合使用
Method Amethon=Class.forName("reflect.User").getDeclaredMethod("User",String.class,Integer.class,App.class);
Object value = Amethon.invoke(Class.forName("reflect.User").newInstance(), "aaa",12,Class.forName("reflect.App")
.getDeclaredConstructor(Integer.class,Integer.class).newInstance(100,200));
System.out.println(value);//User [name=aaa, age=12, app=App [weight=100, height=200]]
}
}
运行后:
public class reflect.User
public class reflect.User
public class reflect.User
public
User [name=null, age=null, app=null]
true
true
接口:true
类:false
true
false
reflect.User
reflect.User
类加载器:sun.misc.Launcher$AppClassLoader@18b4aac2
class reflect.U
class reflect.U
包:package reflect
1
User
String
app,
toString,getName,setName,User,getApp,setAge,getAge,setApp,getType,setType,wait,wait,wait,equals,hashCode,getClass,notify,notifyAll,
reflect.User|2:class java.lang.String,class java.lang.Integer,reflect.User|0:reflect.User|3:class java.lang.String,class java.lang.Integer,class reflect.App,
public reflect.App reflect.User.app
public java.lang.String reflect.User.toString()
User [name=null, age=null, app=null]
User [name=1111, age=11, app=null]
reflect.User$P,
name,age,app,
toString,getName,setName,aaa,User,getApp,setAge,getAge,setApp,
app|2:class java.lang.String,class java.lang.Integer,app|1:class java.lang.String,app|0:app|3:class java.lang.String,class java.lang.Integer,class reflect.App,
private java.lang.String reflect.User.name
private java.lang.String reflect.User.aaa()
private reflect.User(java.lang.String)
User [name=SSSSSSSSS, age=null, app=null]
User [name=SSSSSSSSS, age=null, app=null]
User [name=null, age=null, app=null]
User [name=aaa, age=12, app=App [weight=100, height=200]]