一:Class对象的机制与实现
新建两个Java文件
1、Book.java
package com.cc.reflection;
public class Book {
private int id;
private String name;
private String type;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
2、Test.java
package com.cc.reflection;
public class Test {
public static void main(String[] args) {
// 三种获取类对象的方法
Class demo1 = null;
Class demo2 = null;
Class demo3 = null;
// 通过class的静态forName方法
try {
demo1 = Class.forName("com.cc.reflection");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(demo1);
// 通过类的实例化对象来获取类
Book book = new Book();
Object object = book;
System.out.println(object.getClass());
// 直接利用类名获取对象
demo3 = Book.class;
System.out.println(demo3);
// 通过类对象来获取一个对象
try {
Book bo1 = (Book) demo3.newInstance();
System.out.println("实例化后的对象" + bo1);
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果:
二、Filed对象的机制与实现
Java.lang.reflect.Field,是用于表示类中,接口中属性对象的类
可以操作类中私有,以及公有等全部属性和属性的信息
新建FieldTest.java
package com.cc.reflection;
import java.lang.reflect.Field;
import org.apache.jasper.tagplugins.jstl.core.ForEach;
public class FieldTest {
//该方法用于使用传递过来的Class对象·获取类中的属性
public void show(Class class1){
//getDeclaredField和getField的方法区别在于,可以将私有属性获取到,而后者只能获得公有属性
Field[] fi=class1.getDeclaredFields();
for(Field ff:fi){
System.out.println(ff.getName());
System.out.println(ff.getType());
}
//使用另外一种方式获取类中的属性
Field[] fi1=class1.getFields();
for(Field ff:fi1){
System.out.println(ff.getName());
System.out.println(ff.getType());
}
}
//该方法用于使用传递过来的实体类对象获取属性以及属性的值
public void show (Object obj){
Class class1=obj.getClass();
Field[] fields=class1.getDeclaredFields();
for(Field ff : fields){
try {
//需要设置访问权限,要不然无法访问
ff.setAccessible(true);
System.out.println(ff.getName()+"值"+ff.get(obj));
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args){
Book bo=new Book();
bo.setId(1);
bo.setName("什么鬼");
bo.setType("科幻");
FieldTest fTest=new FieldTest();
fTest.show(Book.class);
fTest.show(bo);
}
}
运行结果
三、Method对象的机制与实现
可以操作类中私有公有等全部方法
MethodTest.java
package com.cc.reflection;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class MethodTest {
//该方法用于获取对象的所有方法名称,返回类型,以及参数信息
public void show(Object obj)
{
Class class1=obj.getClass();
Method[] me =class1.getDeclaredMethods();
for(Method mm:me){
System.out.println("方法名称"+mm.getName());
System.out.println("方法修饰符"+Modifier.toString(mm.getModifiers()));
System.out.println("方法返回值"+mm.getReturnType());
Class[] preType=mm.getParameterTypes();
System.out.println("方法参数列表");
for(Class class2:preType )
{
System.out.println(class2.getName());
}
}
}
//该方法用于使用传递过来的实体对象,获取其中的方法并调用
public void showUse(Object obj){
Class class1=obj.getClass();
try {
Method method=class1.getMethod("getName", null);
//对获取的方法进行调用
method.invoke(obj, new Object[0]); //method.invoke的第二个参数是object的一个数组
Method method1=class1.getMethod("setName", String.class);
//对获取的方法进行调用
method1.invoke(obj, "西游记"); //method.invoke的第二个参数是object的一个数组
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args)
{
Book book=new Book();
book.setId(1);
book.setName("盛开的滑稽");
book.setType("惊悚");
MethodTest mTest=new MethodTest();
// mTest.show(book);
mTest.showUse(book);
System.out.println(book.getName());
}
}
运行结果