Class类与java反射

来源:互联网 发布:安卓编写软件 编辑:程序博客网 时间:2024/04/28 08:06

Class类与java反射

概念

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

特点

优点:能够使我们的代码更加灵活,更加容易实现面向对象

缺点:会降低程序的性能,而且复杂度更高。(反射是需要解析字 节码,将内存中的对象进行解析)

 

publicstaticvoid main(String[] args) throws ClassNotFoundException{ //Object.getClass();只对引用类型有用 Class<?extends Date> d=new Date().getClass();//获得Class对象/*Object dd=new Date(); Class<?extends Object> d=dd.getClass();*/ System.out.println(d.getName());           //输出对象名称 //.class如果类型可用但是没有对象则可以在类型后面加上“.class”来获得(这也是原始类型获得对象最简单的方式) Class<Boolean>b=boolean.class; System.out.println(b.getName());  //Class.forName();如果知道类的全名,则可以用静态方法Class.forName()来获得Class对象。它不能用在原始类型上,但是可以用在原始类型数组上。可能抛出ClassNotFoundException异常 Class<?>s=Class.forName("java.lang.String");//获得Class对象 System.out.println(s.getName());  //包装类的TYPE域:每个原始类型和void都有包装类。利用TYPE域就可以获得Class对象 Class<Double>dd=Double.TYPE; System.out.println(dd.getName()); }输出:java.util.Datebooleanjava.lang.Stringdouble

获得Class对象(四种方法,见代码及注释)

 

获得Class类对象后,就可以使用该类中提供的方法获取关于类的各种信息,例如构造方法、成员变量、成员方法、内部类等

获得修饰符

通过java.lang.reflect.Modifiter类可以解析出getModifiters()方法的返回值所表示的修饰符信息

静态方法

说明

itPublic(Int mod)

查看是否被public修饰,如果是则返回true,否则返回false

itProtected(int mod)

isPrivate(int mod)

isStatic(int mod)

isFinal(int mod)

是指定的修饰符修饰则返回true,否则返回false

toString(int mod)

以字符串的方式返回所有的修饰符

访问构造方法,方法,成员变量(公共指的是public修饰的

案例:声明一个Employee类,然后利用java的反射机制访问Employee类的constructormethodfield

  

publicclass Employee {    publicStringname;    privateintage;    privatecharsex;    public Employee(){    };    privateEmployee(Stringname,int age){       this.name=name;       this.age=age;    }    publicvoid method1(){       System.out.println("公共成员方法一");    }    publicvoid method2(){       System.out.println("公共成员方法二");    }    privateintmethod3(int i){       System.out.println("私有方法三");       return i;    }} publicclass Tests {    publicstaticvoid main(String[]args)throws NoSuchMethodException, SecurityException,NoSuchFieldException{       Class<Employee>e=Employee.class;       //访问构造方法       Constructor<Employee>c=e.getDeclaredConstructor(String.class,int.class);//返回类中指定构造方法中的一个       System.out.println(Modifier.toString(c.getModifiers()));       Constructor<Employee>c1=e.getConstructor((Class<Employee>[])null);//返回类中公共构造方法中的一个(这里返回的是为空的构造方法)       System.out.println(Modifier.toString(c1.getModifiers())+"\n");        //访问成员变量       Fieldf1=e.getDeclaredField("age");//返回类中指定成员变量的一个Field对象       System.out.println(Modifier.toString(f1.getModifiers()));       Fieldf=e.getField("name");//返回类中指定公共成员变量的一个Field对象       System.out.println(Modifier.toString(f.getModifiers())+"\n");       //访问成员方法       Method[]m=e.getDeclaredMethods();//返回类中所有成员方法的一组Method对象       for(Method m1:m){           System.out.print(m1.getName()+" ");       }       Methodm2=e.getMethod("method1");//根据公共方法名称获得Method对象       System.out.println("\n"+m2.getName());       Methodm3=e.getDeclaredMethod("method3",int.class);//根据成员方法名称和参数找方法       System.out.println(m3.getName());    }}

原创粉丝点击