java--反射

来源:互联网 发布:变色龙引导u盘安装mac 编辑:程序博客网 时间:2024/05/02 02:20

什么是反射

      1)  java反射机制(java中是没有反射的,但是存在反射机制):程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言。从这个观点看,Perl,

             Python,Ruby是动态语言,C++,Java,C#不是动态语言。

      2)java反射机制定义:

                Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态

                获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。

反射的功能   

     Java反射机制主要提供以下功能:

               在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象

               的方法;生成动态代理。

反射相关知识     

   类:用于描述一类事物的共性,该类有什么属性,没有什么属性。

   对象:描述这个属性有具体什么值。

   Class:所有的类都属于Class,他可以描述类的名字,类的访问属性,类属于那个包,方法名称列表,字段名称列表等一切关于类的信息。

  获得Class的一个对象(即返回一个字节码)

      User  user2 = new User(); //编译时的对象(只要是new的就是)      Class  c1 = User.class; //没有编译时对象,此时Class相当于所有User类的类的对象      Class  c2 = user2.getClass();//有编译时对象user2,获得运行时对象c1      Class  c3 = Class.forName("org.jsoft.text.User");//如果内存中有则直接返回,没有JVM新加载一个

在JDK中有9个预定义的Class类实例:

   byte,char,short,int,long,float,double,boolean,void

Class c7 =int.class;Class c8 =integer.class;System.out.println(c7==c8);//falseSystem.out.println(c7==Integer.TYPE);//true
获得一个对象以后想访问属性

Constructor类:    

Consructor[] c7 =User.class.getConstructors();//获得所有的构造器Class<User> clazz =User.class;Consructor<User> c =clazz.getConstructor(String.class);//获得某个构造器User user = c.newInstance("hello");//这两句话等同于User user = new User("hello");创建对象user.a();//调用方法Field fieldUsername =clazz.getField("username");//必须是public的属性

如果属性是私有的,必须通过以下代码进行暴力反射才可以访问
Class<User> clazz =User.class;Consructor<User> c =clazz.getConstructor(String.class);//获得某个构造器User user = c.newInstance("ivan");Field fieldUsername =clazz.getDeclaredField("username");fieldUsername.setAccessible(true);System.out.println(fieldUsername.get(user));//这个user必须是运行时的,且有get/set方法

获得方法

<pre name="code" class="java">Class<User> clazz =User.class;Consructor<User> c =clazz.getConstructor(String.class);//获得某个构造器User user = c.newInstance("ivan");Method m = clazz.getMethods();//获得全部的方法;Method m = clazz.getMethod("a","int.class");//方法名,参数类型m.invoke(user,10);//访问方法(对象,参数值)m.invoke(null,10);//表示该方法为静态方法,参数有就填,没有不填

内省(Introspector)

       如果一个类,只要简单的属性以及相对应的set/get方法,我们称这个类为JavaBean.在JDK中专门提供一些对于JavaBean操作的包(java.beans).称为内省。

       JavaBean主要用于两个模块之间进行传值。我们称这个为JavaBean为VO(value object)只提供属性名称给JavaBean赋值最简单的办法。

      

Java代理:

      代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户

      端和目标对象之间起到中介的作用。

      代理模式的角色:

             1)抽象角色:声明真实对象和代理对象的共同接口

             2)代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。

                   同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。

             3)真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。

反射 类对象,类加载时把类的信息保存在jvm中就会产生一个相应的对象(记录类信息的对象),只要类对象存在则类信息就在

  获得类对象应用的三种方式:

          ①Class c1=ArrayList.class;

          ②Object l=new ArrayList();

             Class c2=l.getClass();

          ③StringclassName="java.util.ArrayList";

             Class c3=Class.forName(className);

             Class[] cs=c1.getInterfaces();//获得接口

             Class c=Animal.class;

           Field[] fs=c.getDeclaredFields();//获得属性的数组

           Method[] ms=c.getDeclaredMethods();//获得本类所有公私有的方法,getMethods()获得父类所有公开的方法

           Constructor[]cons=c.getDeclaredConstructors();//获得构造方法的数组

           Object o2=c.newInstance();//创建类的对象

           Methodm1=c.getDeclaredMethod("study");//找到方法名是study的方法

           m1.setAccessible(true);//设置为可以调用

           m1.invoke(o2);//调用m1方法

           Methodm2=c.getDeclaredMethod("study", String.class);

           m2.setAccessible(true);

           m2.invoke(o2,"CoreJava");//调用m2的方法,方法的参数是CoreJava





0 0