Java反射机制
来源:互联网 发布:手机系统克隆软件 编辑:程序博客网 时间:2024/06/06 04:30
一:反射机制概念:
运行状态下,对于任意一个类,都能知道它的属性(包括private)及方法.对于任意一个类的实例化对象,都能调用它的属性和方法,这种动态获取信息的方式称之为java反射.
1.反射机制获取类,三种途径:(参考)
- /**
- * 反射机制获取类有三种方法
- */
- @Test
- public void testGetClass() throws ClassNotFoundException {
- Class clazz = null;
- //1 直接通过类名.Class的方式得到
- clazz = Person.class;
- System.out.println("通过类名: " + clazz);
- //2 通过对象的getClass()方法获取,这个使用的少(一般是传的是Object,不知道是什么类型的时候才用)
- Object obj = new Person();
- clazz = obj.getClass();
- System.out.println("通过getClass(): " + clazz);
- //3 通过全类名获取,用的比较多,但可能抛出ClassNotFoundException异常
- clazz = Class.forName("com.java.reflection.Person");
- System.out.println("通过全类名获取: " + clazz);
- }
2.获取类中方法:method():
Class clazz = Class.forName("com.java.reflection.Person");//类路径要写全
Method method = clazz.getDeclaredMethod("methodName",String.class);//第一个参数是方法名,后面的是方法里的参数
- //使用Class类的newInstance()方法创建类的一个对象
- //实际调用的类的那个 无参数的构造器(这就是为什么写的类的时候,要写一个无参数的构造器,就是给反射用的)
- //一般的,一个类若声明了带参数的构造器,也要声明一个无参数的构造器
- Object obj = clazz.newInstance();
- method2.invoke(obj, "changwen", 22);
注 invoke()用法:
- /**
- * @param className 某个类的全类名
- * @param methodName 类的一个方法的方法名,该方法也可能是私有方法
- * @param args 调用该方法需要传入的参数 ...可变参数的意思
- * @return 调用方法后的返回值
- */
- public Object invoke(String className, String methodName, Object ... args) {
- Object obj = null;
- try {
- obj = Class.forName(className).newInstance();
- return invoke(obj, methodName, args);
- } catch (InstantiationException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- return invoke(null, methodName, args);
- }
- /**
- * @param obj 方法执行的那个对象
- * @param methodName 类的一个方法的方法名,该方法也可能是私有方法,还可能是该方法在父类中定义的私有方法
- * @param args 调用该方法需要传入的参数 ...可变参数的意思
- * @return 调用方法后的返回值
- */
- public Object invoke(Object obj, String methodName, Object ... args) {
- //1、获取Method对象
- Class [] parameterTypes = new Class[args.length];
- for (int i=0 ; i<args.length; i++){
- parameterTypes[i] = args[i].getClass();
- }
- try {
- //2、执行Method方法
- Method method = getMethod(obj.getClass(), methodName,parameterTypes);
- //通过反射执行private方法
- method.setAccessible(true);
- //3、返回方法的返回值
- return method.invoke(obj,args);
- } catch (Exception e) {
- }
- return null;
- }
- /**
- * 获取clazz 的methodName 方法, 该方法可能是私有方法,还可能是父类中的私有方法
- */
- public Method getMethod(Class clazz, String methodName, Class ... parameterTypes) {
- //注意这个循环里的内容!!!
- for (; clazz != Object.class; clazz = clazz.getSuperclass()){
- try {
- return clazz.getDeclaredMethod(methodName, parameterTypes);
- } catch (Exception e) { //这里要写Exception,不然会出错,应该是有部分异常没有捕获
- }
- }
- return null;
- }
阅读全文
0 0
- 【反射】JAVA反射机制
- 【Java】JAVA反射机制
- Java 反射机制[Field反射]
- Java 反射机制[Method反射]
- Java反射机制笔记-反射机制
- java的反射机制
- Java的反射机制
- java反射机制详解!
- Java反射机制
- Java的反射机制
- java 反射机制--侯捷
- java反射机制
- java反射机制
- [候捷]Java反射机制
- java 反射机制
- java 反射机制初探
- 关于Java反射机制
- java反射机制
- display flex
- 一头扎进springboot之Hello World
- 在Unity5中使用Protobuf
- Java 遍历文件夹
- 【bzoj3142】[Hnoi2013]数列
- Java反射机制
- github 提交原创代码出现的问题-The requested URL returned error: 403 和github Permission denied (publickey) 的问题
- 如何高效利用GitHub
- java面向对象思想+方法参数+封装+this
- 业务日志收集方案
- 突破10万高并发的nginx性能优化经验(含内核参数优化)
- DrawerLayout的使用
- Ubuntu中docker容器运行apt-get update失败 Err:1 http://archive.ubuntu.com/ubuntu xenial InRelease
- 由configure文件生成Makefile文件简单介绍