Java反射机制

来源:互联网 发布:linux sz 下载目录 编辑:程序博客网 时间:2024/04/29 05:31

一: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 blocke.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 blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.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 blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.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 blocke.printStackTrace();} catch (Exception e) {// TODO Auto-generated catch blocke.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());}}


运行结果




0 0
原创粉丝点击