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) | 以字符串的方式返回所有的修饰符 |
案例:声明一个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());
}
}
相关文章推荐
- 19、Java入门—反射之Class类的使用
- Java_反射_Class类(Method,Field,Constructor)
- Java反射(一)-Class类的使用
- 黑马程序员-JAVA学习之反射以及Class类的常用方法
- (Java基础--反射)透彻分析反射的基础--Class类
- java反射学习笔记(1)-----Class类的使用
- Java反射学习总结(1)——Class类的使用
- java.lang.Class类和反射机制创建对象
- java.lang.Class类 和 反射
- Java Class类及反射机制
- Class类与JAVA反射
- Java反射的基础——Class类
- 使用反射创建Bean、Spring中是如何根据类名配置创建Bean实例、Java提供了Class类获取类别的字段和方法,包括构造方法
- 黑马程序员——Java基础---反射Class类、Constructor类、Field类
- Java基础---基础加强---增强for循环、自动拆装箱及享元、枚举的作用、实现带有构造方法、透彻分析反射的基础_Class类、成员变量的反射、数组参数的成员方法进行反射、数组的反射应用
- JAVA反射——Class类、动态加载类的简介
- 使用反射创建Bean、Spring中是如何根据类名配置创建Bean实例、Java提供了Class类获取类别的字段和方法,包括构造方法
- java反射(二):获取Class类的四种方式
- 黑马程序员——Java基础---反射Class类、Constructor类、Field类
- Java第六课 数组的复制与排序,Runtime类与Process类,Class类与反射API,Runtime类与单例设计模式。