反射是框架设计的灵魂,
00-1010获取类对象的方法类对象函数获取成员变量获取构造方法获取成员方法获取完整类名字段:成员变量构造器:构造方法方法:方法对象案例框架:半成品软件。软件开发可以在框架的基础上进行,以简化编码。
反射就是将Java类的成员一一映射到Java对象中。
即在运行状态下,可以知道任何类的所有属性和方法;
对于任何对象,您都可以调用它的任何方法和属性。
这种动态获取信息,动态调用对象方法的功能被称为Java反射机制。
好处:
1.你可以在程序运行时操作这些对象。
2.它可以被解耦以提高程序的可伸缩性。
00-10101.Class.forname(完整的类名):将字节码文件加载到内存中,并返回类对象。
用于配置文件,类名在配置文件中定义。读取文件并加载类。
2.类名。class:由类名的属性class得到。
用于多参数传输。
3.对象。getclass():getclass()方法在Object类中定义。
获取多个对象的字节码的方法
//1.Class.forName(完整类名)class cls 1=class . forname( com . zjq . Java base . base 25 . domain . person );system . out . println(cls 1);//2.类名。class class cls 2=person . class;system . out . println(cls 2);//3.对象。getClass()Person p=new Person();class cls 3=p . getclass();system . out . println(cls 3);结论:
相同的字节码文件(*。Class)在一个程序运行过程中只会加载一次,任何方法得到的类对象都是一样的。
测试的00-1010人类别:
包com . zjq . Java base . base 25 . domain;/* * * * @作者zjq */公有类Person {私有字符串名;私人年龄;公共字符串a;受保护的字符串b;字符串c;私有字符串d;public Person(){ } public Person(String name,int age){ this . name=name;this.age=年龄;} public String getName(){ return name;} public void set name(String name){ this . name=name;} public int getAge(){ return age;} public void setAge(int age){ this . age=age;} @ Override public String to String(){ return Person { name= name ,age= age ,a= a ,b= b ,c= c ,d= d }} public void eat(){ system . out . println( eat . );} public void eat(String food){ system . out . println( eat . 食物);}}
00-1010field [] getfields():获取所有公共修饰的成员变量。
获取指定名称的公共修饰成员变量。
字段[] getDec
laredFields() 获取所有的成员变量,不考虑权限修饰符
Field getDeclaredField(String name)
案例:
//0.获取Person的Class对象Class personClass = Person.class;//1.Field[] getFields()获取所有public修饰的成员变量Field[] fields = personClass.getFields();for (Field field : fields) { System.out.println(field);} System.out.println("------------");//2.Field getField(String name)Field a = personClass.getField("a");//获取成员变量a 的值Person p = new Person();Object value = a.get(p);System.out.println(value);//设置a的值a.set(p,"张三");System.out.println(p); System.out.println("==================="); //Field[] getDeclaredFields():获取所有的成员变量,不考虑修饰符Field[] declaredFields = personClass.getDeclaredFields();for (Field declaredField : declaredFields) { System.out.println(declaredField);}//Field getDeclaredField(String name)Field d = personClass.getDeclaredField("d");//忽略访问权限修饰符的安全检查d.setAccessible(true);//暴力反射Object value2 = d.get(p);System.out.println(value2);
获取构造方法们
Constructor<?>[] getConstructors()
Constructor<T> getConstructor(类<?>... parameterTypes)
Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
Constructor<?>[] getDeclaredConstructors()
案例:
//0.获取Person的Class对象Class personClass = Person.class; //Constructor<T> getConstructor(类<?>... parameterTypes)Constructor constructor = personClass.getConstructor(String.class, int.class);System.out.println(constructor);//创建对象Object person = constructor.newInstance("张三", 23);System.out.println(person); System.out.println("----------"); Constructor constructor1 = personClass.getConstructor();System.out.println(constructor1);//创建对象Object person1 = constructor1.newInstance();System.out.println(person1); Object o = personClass.newInstance();System.out.println(o);
获取成员方法们
Method[] getMethods()
Method getMethod(String name, 类<?>... parameterTypes)
Method[] getDeclaredMethods()
Method getDeclaredMethod(String name, 类<?>... parameterTypes)
案例:
//0.获取Person的Class对象Class personClass = Person.class;//获取指定名称的方法Method eat_method = personClass.getMethod("eat");Person p = new Person();//执行方法eat_method.invoke(p); Method eat_method2 = personClass.getMethod("eat", String.class);//执行方法eat_method2.invoke(p,"饭"); System.out.println("-----------------"); //获取所有public修饰的方法Method[] methods = personClass.getMethods();for (Method method : methods) { System.out.println(method); String name = method.getName(); System.out.println(name); //method.setAccessible(true);} //获取类名String className = personClass.getName();System.out.println(className);//com.zjq.javabase.base25.domain.Person
获取全类名
String getName()
Field:成员变量
操作:
1. 设置值
void set(Object obj, Object value)
2. 获取值
get(Object obj)
3. 忽略访问权限修饰符的安全检查
setAccessible(true)
:暴力反射
Constructor:构造方法
创建对象:
T newInstance(Object... initargs)
如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance方法
Method:方法对象
执行方法:
Object invoke(Object obj, Object... args)
获取方法名称:
String getName:获取方法名
案例
需求:写一个"框架",不能改变该类的任何代码的前提下,可以帮我们创建任意类的对象,并且执行其中任意方法
实现:
1. 配置文件
2. 反射
步骤:
1. 将需要创建的对象的全类名和需要执行的方法定义在配置文件中
2. 在程序中加载读取配置文件
3. 使用反射技术来加载类文件进内存
4. 创建对象
5. 执行方法
代码:
pro.properties文件内容如下:
className=com.zjq.javabase.base25.domain.StudentmethodName=sleep
Student类:
public class Student { public void sleep() { System.out.println("sleep..."); }}
反射操作:
//1.加载配置文件//1.1创建Properties对象Properties pro = new Properties();//1.2加载配置文件,转换为一个集合//1.2.1获取class目录下的配置文件ClassLoader classLoader = ReflectTest.class.getClassLoader();InputStream is = classLoader.getResourceAsStream("pro.properties");pro.load(is); //2.获取配置文件中定义的数据String className = pro.getProperty("className");String methodName = pro.getProperty("methodName"); //3.加载该类进内存Class cls = Class.forName(className);//4.创建对象Object obj = cls.newInstance();//5.获取方法对象Method method = cls.getMethod(methodName);//6.执行方法method.invoke(obj);
到此这篇关于Java框架设计灵魂之反射的示例详解的文章就介绍到这了,更多相关Java反射内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。