您的位置:首页 > 编程语言 > Java开发

Class类与java反射

2017-10-13 16:14 127 查看

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.Date
boolean
java.lang.String
double

获得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类的constructor、method、field

  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());
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: