- 一、反射的简介
- 为什么使用反射:
- 反射的作用
- 二、反射获取类对象:
- 1.getClass()
- 2.forName()
- 3.T.class(T是任意的java类型,包括void关键字)
- 三、反射获取类对象信息的方法
- 获取Filed
- 获取Method
- 获取constructor(构造器)
- 这里需要介绍一下newInstance();
- 这里需要介绍一下setAccessible();
- invoke and setAccessible的使用。
- 总结
一、反射的简介 为什么使用反射:
例如当我们在写javaweb的工程时,tomcat是早就写好的,你无法在tomcat中通过人工的方式new出对象,tomcat无法知道此时程序员创建的servlet的类名,这时就需要用到反射。
反射的作用通过非new的方式生成对象。java反射机制实在运行状态中,对于任意一个类,都能知道这个类的的所有属性和方法。对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取信息以及动态调用对象的方法的功能被称为java的反射机制。
二、反射获取类对象: 1.getClass()Object类中的getClass()方法将会返回一个Class类型的实例
Class c1 = student.getClass();
常用的Class方法是getName;这个方法将会返回类的名字。
System.out.println(c1.getName);
//结果为:Student
2.forName()
通过调用静态方法forName获得类名对应的Class对象。
String className="java.util.Random";
Class c2=Class.forName(className);
3.T.class(T是任意的java类型,包括void关键字)
Class cl1=int.class;
Class cl2=Double[].class;
T.class代表匹配的类对象。
三、反射获取类对象信息的方法
获取Filed
getField();//获取指定的public类型的全局变量。
getFields();//获取所有的public类型的全局变量信息(包括子类的public全局变量)。
getDeclaredField()//忽略访问修饰符,获取类当中指定的全局变量信息。
getDeclaredFields()//获取类当中所有的全局变量信息。(只包含本类的全局变量)
*set(Object,value);Object:对象 --》只有先创建对象才能给变量赋值。(有了对象才有地方存储变量的值)
*get(Object)获取当前变量在对象中保存的的值。
Class student =Student1.class;
Field[] fields=student.getDeclaredFields();
for(Field field:fields){
System.out.println("Declared="+field);
}
System.out.println("----------");
Field[] fields1=student.getFields();
for(Field field:fields1){
System.out.println(field);
}
System.out.println("----------");
Field age = student.getField("age");
System.out.println(age);
System.out.println("-----------");
Field name=student.getDeclaredField("name");
System.out.println(name);
获取Method
getMethod()
getMethods()
getDeclaredMethods()
getDeclaredMethod();getDeclaredMethod(String.class,arg...);//获取类当中指定的方法。
invoke()--》执行方法;
Method[] methods=student.getMethods();
for(Method method:methods){
System.out.println(method);
}
System.out.println("-----------");
Method[]methods1=student.getDeclaredMethods();
for(Method method:methods1){
System.out.println(method);
}
System.out.println("------------");
Method method=student.getMethod("run", String.class);
System.out.println(method);
获取constructor(构造器)
getConstructor(args....)
getDeclaredConstructor(args.....)
getConstructors()
getDeclaredConstructors()
*newInstance(Object...initarges)//利用获取的构造器来创建对象
Class student=Student1.class;
Constructor constructor=student.getDeclaredConstructor(String.class);
System.out.println(constructor);
constructor.setAccessible(true);
Student1 student1=(Student1)constructor.newInstance("张三");
System.out.println(student1.age);
System.out.println("-------------------0");
这里需要介绍一下newInstance();
newInstance(Object…initarges)//利用获取的构造器来创建对象,如果调用的构造器需要有入参,则在后面的括号中加入参数。
这里需要介绍一下setAccessible();暴力反射----》忽略private类型的检测(任何时候调用private类型)
setAccessible(true).当后面的参数为true时,可以访问private修饰类型。
Constructor constructor=student.getDeclaredConstructor(String.class);
constructor.setAccessible(true);
Student1 student1=(Student1)constructor.newInstance("张三");
//Field
Field sex=student.getDeclaredField("sex");
sex.setAccessible(true);
sex.set(student1,2);
System.out.println(sex.get(student1));
System.out.println("----------------");
Field age=student.getField("age");
age.set(student1,20);
System.out.println(age.get(student1));
System.out.println("-----------------");
//method
System.out.println(student1.getName());
System.out.println("-----------");
Method method=student.getDeclaredMethod("setName", String.class);
method.setAccessible(true);
method.invoke(student1,"xxx");
System.out.println(student1.getName());
总结
以上就是今天学习反射的全部知识,本文只是介绍了反射的一些相关用法。
后续会更新更深层讲解。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)