1、背景
1)Reflection也就是反射 是Java被视为动态(或准动态)语言的一个关键性质
2)反射机制指的是程序在运行时能够获取任何类的内部所有信息
2、实现功能概述
1)只要给定类的全名,即可通过反射获取类的所有信息。
2)反射可以在程序运行时获取任意一个对象所属的类对象。
3)在运行时可以获取到类中所有属性对象,并对其操作(包括私有属性)。
4)在运行时可以获取到类中,父类中所有方法,并调用。
5)目前主流的应用框架如Struts2,Hibernate,Spring,SpringMVC等框架的核心全部是利用Java的反射机制来实现的。
Class对象的机制与实现
1、Class对象概述
1)Class其实就是类的类型
2)字符串类型就是String,整形类型就是Integer,String和Integer类型就是Class
2、Class对象的常用方法介绍
newInstance() 实例化对象
3、实例化对象的三种方式
JavaBean
public class Book { private int id; private String name; public String type; /** * @return the id */ public int getId() { return id; } /** * @param id the id to set */ public void setId(int id) { this.id = id; } /** * @return the name */ public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } /** * @return the type */ public String getType() { return type; } /** * @param type the type to set */ public void setType(String type) { this.type = type; } }
package main; import bean.Book; public class Test1 { public static void main(String[] args) { // TODO Auto-generated method stub Class demo1=null; Class demo2=null; Class demo3=null; //实例化对象的第一种方式 try{ demo1=Class.forName("bean.Book"); }catch(Exception e){ e.printStackTrace(); } System.out.println(demo1); //实例化对象的第二种方式 Book bo=new Book(); Object ob=bo; System.out.println("第二种"+ob.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(); } } }
Field 对象的机制与实现
package main; import java.lang.reflect.Field; import bean.Book; public class FieldTest { //该方法用于使用传递过来的Class对象获取类中的属性 public void show(Class c1){ Field[] fi=c1.getDeclaredFields(); //{可以将私有属性获取到} getDeclaredFields()获取类中的所有属性 for(Field ff:fi){ System.out.println(ff.getName()); System.out.println(ff.getType()); } System.out.println("~~~~~~~~~~~~~~~~~"); Field[] fi1=c1.getFields(); //只可以获取到公有属性 for(Field ff1:fi1){ System.out.println(ff1.getName()); System.out.println(ff1.getType()); } System.out.println("~~~~~~~~~~~~~~~~~"); } //该方法用于使用传递过来的实体类对象 获取属性以及属性的值 public void show(Object ob){ Class c1=ob.getClass(); Field[] fi=c1.getDeclaredFields(); for(Field ff:fi){ try { ff.setAccessible(true); System.out.println(ff.getName()+":"+ff.get(ob)); } 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) { // TODO Auto-generated method stub Book bo=new Book(); bo.setId(1); bo.setName("倾城之恋"); bo.setType("文学"); FieldTest ft=new FieldTest(); ft.show(Book.class); Book oob=new Book(); oob.setId(2); oob.setName("那年夏天"); oob.setType("文学"); FieldTest ft1=new FieldTest(); ft1.show(oob); } }
getDeclaredAnnotations() 获取方法的全部注解
package main; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import bean.Book; public class MethodTest { //该方法用于获取对象的所有方法名称、返回值类型、以及参数信息 public void show(Object ob){ Class c2=ob.getClass(); Method[] mt=c2.getDeclaredMethods(); for(Method mm:mt){ System.out.println("方法名称:"+mm.getName()); System.out.println("方法修饰符"+Modifier.toString(mm.getModifiers())); System.out.println("方法返回值类型"+mm.getReturnType()); System.out.println("方法参数列表"); Class[] preType=mm.getParameterTypes(); for(Class c21:preType){ System.out.println(c21.getName()); } } } public static void main(String[] args) { // TODO Auto-generated method stub Book bk=new Book(); bk.setId(3); bk.setName("我和凤姐居住的日子"); bk.setType("惊悚"); MethodTest mt=new MethodTest(); mt.show(bk); } }
Method 对象的机制与实现
package main; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import bean.Book; public class MethodTest { //该方法用于获取对象的所有方法名称、返回值类型、以及参数信息 public void show(Object ob){ Class c2=ob.getClass(); Method[] mt=c2.getDeclaredMethods(); for(Method mm:mt){ System.out.println("方法名称:"+mm.getName()); System.out.println("方法修饰符"+Modifier.toString(mm.getModifiers())); System.out.println("方法返回值类型"+mm.getReturnType()); System.out.println("方法参数列表"); Class[] preType=mm.getParameterTypes(); for(Class c21:preType){ System.out.println(c21.getName()); } } } //该方法用于使用传递过来的实体对象 获取其中的方法 并调用 public void showUse(Object ob){ Class c1=ob.getClass(); try { Method me=c1.getMethod("getName", null); try { me.invoke(ob, new Object[0]); } catch (IllegalAccessException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } Method me1=c1.getMethod("setName", String.class); try { me1.invoke(ob, "嘻游记"); Class[] c4={String.class,int.class}; Method me2=c1.getMethod("test", c4); Object[] obb={"哈哈",12}; me2.invoke(ob, obb); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { // TODO Auto-generated method stub Book bk=new Book(); bk.setId(3); bk.setName("我和凤姐居住的日子"); bk.setType("惊悚"); //MethodTest mt=new MethodTest(); //mt.show(bk); MethodTest mte=new MethodTest(); mte.showUse(bk); System.out.println(bk.getName()); } }
时间: 2024-11-05 05:10:57