反射机制
来源:互联网 发布:淘宝店进货渠道有哪些 编辑:程序博客网 时间:2024/05/21 09:03
反射机制:
含义:
JAVA反射机制是在运行状态中,对于任意一个类 (class文件),都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个方法和属性;
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
动态获取类中信息,就是java反射 。
可以理解为对类的解剖。
第一步:获取字节码对象:
第一种方式:
Object类中的getClass()方法的。 想要用这种方式,必须要明确具体的类,并创建对象。
Person p = new Person(); Class clazz = p.getClass();
第二种方式:
任何数据类型都具备一个静态的属性.class来获取其对应的Class对象。
相对简单,但是还是要明确用到类中的静态成员。
Class clazz = Person.class;
第三种方式:
Class类中的
static Class<?>
forName(String className)
返回与带有给定字符串名的类或接口相关联的
Class
对象。只要通过给定的类的 字符串名称就可以获取该类,更为扩展。
用Class类中的方法forName()完成.
这种方式只要有名称即可,更为方便,扩展性更强。
String className = "cn.itcast.bean.Person";Class clazz = Class.forName(className);
通过空参构造函数实例化
Class类中的
T
newInstance()
创建此 Class 对象所表示的类的一个新实例。
import java.io.FileReader;import java.lang.reflect.Constructor;public class ReflectDemo2 { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, Exception {createNewObject();} public static void createNewObject() throws ClassNotFoundException, InstantiationException, IllegalAccessException{ String name = "cn.itcast.bean.Person";//找寻该名称类文件,并加载进内存,并产生Class对象。Class clazz = Class.forName(name);//空参构造函数产生该类的对象 Object obj = clazz.newInstance(); }}
通过有参构造函数实例化
第一步:Class类中的
Constructor<T>
getConstructor(Class<?>... parameterTypes)
返回一个
Constructor
对象,它反映此 Class
对象所表示的类的指定公共构造方法。 Constructor<?>[]
getConstructors()
返回一个包含某些
Constructor
对象的数组,这些对象反映此 Class
对象所表示的类的所有公共构造方法。 Constructor<T>
getDeclaredConstructor(Class<?>... parameterTypes)
返回一个
Constructor
对象,该对象反映此 Class
对象所表示的类或接口的指定构造方法。 Constructor<?>[]
getDeclaredConstructors()
返回
Constructor
对象的一个数组,这些对象反映此 Class
对象表示的类声明的所有构造方法。第二步:构造器方法:
T
newInstance(Object... initargs)
使用此
Constructor
对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。import java.io.FileReader;import java.lang.reflect.Constructor;public class ReflectDemo2 { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, Exception {createNewObject_2();}public static void createNewObject_2() throws Exception {/* * 既然是通过指定的构造 函数进行对象的初始化, * 所以应该先获取到该构造函数。 通过字节码文件对象即可完成。 * 该方法是:getConstructor(paramterTypes); * */String name = "cn.itcast.bean.Person";//找寻该名称类文件,并加载进内存,并产生Class对象。Class clazz = Class.forName(name);//获取到了指定的构造函数对象。Constructor constructor = clazz.getConstructor(String.class,int.class);//通过该构造器对象的newInstance方法进行对象的初始化。Object obj = constructor.newInstance("小明",38); } }
获取字段:
Field
getField(String name)
返回一个
Field
对象,它反映此 Class
对象所表示的类或接口的指定公共成员字段。 Field
getDeclaredField(String name)
返回一个
Field
对象,该对象反映此 Class
对象所表示的类或接口 声明的所有字段。 Field[]
getDeclaredFields()
返回
Field
对象的一个数组,这些对象反映此 Class
对象所表示的类或接口所声明的所有字段。 Field[]
getFields()
返回一个包含某些
Field
对象的数组,这些对象反映此 Class
对象所表示的类或接口的所有可访问公共字段。该字段的set()、get()方法:
Object
get(Object obj)
返回指定对象上此
Field
表示的字段的值。 void
set(Object obj,Object value)
将指定对象变量上此
Field
对象表示的字段设置为指定的新值。对字段进行暴力访问 void
setAccessible(boolean flag)
将此对象的 accessible 标志设置为指示的布尔值。解释:将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为false 则指示反射的对象应该实施 Java 语言访问检查。
import java.lang.reflect.Field;public class ReflectDemo3 { public static void main(String[] args) throws Exception {getFieldDemo();}/* * 获取字节码文件中的字段。 */public static void getFieldDemo() throws Exception {Class clazz = Class.forName("cn.itcast.bean.Person");Field field = null;//clazz.getField("age");//只能获取公有的,field = clazz.getDeclaredField("age");//只获取本类,但包含私有。 //对私有字段的访问取消权限检查。暴力访问。field.setAccessible(true);Object obj = clazz.newInstance();field.set(obj, 89); Object o = field.get(obj);System.out.println(o); }}
获取成员函数:
Method
getDeclaredMethod(String name,Class<?>... parameterTypes)
返回一个
Method
对象,该对象反映此 Class
对象所表示的类或接口的指定已声明方法。 Method
getMethod(String name,Class<?>... parameterTypes)
返回一个
Method
对象,它反映此 Class
对象所表示的类或接口的指定公共成员方法。 Method[]
getMethods()
返回一个包含某些
Method
对象的数组,这些对象反映此 Class
对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共成员 方法。 Method[]
getDeclaredMethods()
返回
Method
对象的一个数组,这些对象反映此 Class
对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。运行获取到的方法:
Object
invoke(Object obj,Object... args)
对带有指定参数的指定对象调用由此
Method
对象表示的底层方法。import java.lang.reflect.Constructor;import java.lang.reflect.Method;public class ReflectDemo4 {public static void main(String[] args) throws Exception {getMethodDemo_3();}//获取有参数的一般方法、并运行public static void getMethodDemo_3() throws Exception {Class clazz = Class.forName("cn.itcast.bean.Person");Method method = clazz.getMethod("show", String.class,int.class);Object obj = clazz.newInstance();method.invoke(obj, "小强",89);}//获取空参数一般方法、并运行public static void getMethodDemo_2() throws Exception {Class clazz = Class.forName("cn.itcast.bean.Person");Method method = clazz.getMethod("show", null);Constructor constructor = clazz.getConstructor(String.class,int.class);Object obj = constructor.newInstance("小明",37);method.invoke(obj, null); }/* * 获取指定Class中的所有公共函数。 */public static void getMethodDemo() throws Exception {Class clazz = Class.forName("cn.itcast.bean.Person");Method[] methods = clazz.getMethods();//获取的都是公有的方法。 methods = clazz.getDeclaredMethods();//只获取本类中所有方法,包含私有。 for(Method method : methods){System.out.println(method);} }}
0 0
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 解决ScrollView中嵌套Gridview显示不正常的问题
- 快速开发EasyUI Datagrid报表 thinkphp框架 ppt和视频教程
- Java集合类详解
- 名家博客收集
- Scikit-learn:模型评估Model evaluation 之绘图
- 反射机制
- 【Linux4.1.12源码分析】协议栈gro收包之MAC层处理
- 想运营好社交媒体帐号?这11条提醒可别忘了
- 高精模板
- 《JavaScript 闯关记》之单体内置对象
- MYSQL千万级数据量的优化方法积累
- UVA 12118 图+欧拉路
- 试探法
- 单片机栈溢出的一种检测方法