博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java Reflection
阅读量:6924 次
发布时间:2019-06-27

本文共 2055 字,大约阅读时间需要 6 分钟。

Java反射API

获取Class类的实例

4种方法:

  1. 对象-> Class instance
  2. 类名-> Class instance
  3. 类->Class instance
  4. TYPE语法
String str="abc";Class c1=str.getClass();Class c2=Class.forName("java.lang.String");Class c3=java.lang.String.class;Class c4=Boolean.TYPE;

由类名创建实例

Class c=Class.forName("A");c.newInstance();//无参构造Constructor[] cs=c.getDeclaredConstructors();//获取所有构造器,包括private、protected、public,这一点上与getConstructors()不同Constructor c1=cs[0];c1.newInstance(arg1,arg2,arg3);Constructor constructor=c.getDeclaredConstructor(int.class);//根据参数列表获取指定构造器constructor.newInstance(9);

获取与设置Field

值得注意的是,getDeclaredField可以获取所有Field,getField只能获得可见的部分Field。但是即使你通过getDeclaredField获得到了private的属性,你也无法直接对其进行set操作,因为即使反射也不可以超越可见性的。所以当对public的属性进行set可以直接赋值,对private的属性进行set就只能通过那个类提供的setter(该操作见下一节调用方法)。

Class c=null;c=Class.forName("test.A");A b= (A) c.newInstance();c.getDeclaredField("a").set(b,3);//类.set(对象,参数);Field[] fields=c.getDeclaredFields();

调用方法

获取方法

Method m=c.getMethod(method_name,int.class,boolean.class...);//public Method getMethod(String name, Class
... parameterTypes),第二个参数或者传入一个Class数组也可以Class[] ptypes=new Class[5];//再对数组中每个元素初始化,然后进行下一步Method m=c.getMethod(method_name,ptypes);//上面的是针对一般方法的,根据方法名和参数列表去获得方法//下面是根据属性去获得该属性的getter和setterClass c=null;c=Class.forName("test.A");PropertyDescriptor pd = new PropertyDescriptor("a", c);// getMethodMethod getMethod = pd.getReadMethod();// 获得get方法Method setter=pd.getWriteMethod();//获得setter

调用方法

m.invoke(specific_object, arg1,arg2,...);

动态强制类型转换

即你也不知道要转换成哪个类型,要等用户以字符串形式输入一个字符串才知道

Class T=Class.forName("model." + type);T.cast(o);//o是一个对象

通过反射实例化泛型类

public static void main(String... args)  {        Date date=createInstance(Date.class);        String s=createInstance(String.class);        System.out.println("date="+date+", string="+s);    }    public static 
T createInstance(Class
cls) { T obj=null; try { obj=cls.newInstance(); } catch (Exception e) { obj=null; } return obj; }

转载于:https://www.cnblogs.com/windkl/p/7347806.html

你可能感兴趣的文章
sizeof与strlen的区别
查看>>
快嘉开发框架脚手架及使用说明v1
查看>>
laravel 自带Auth多用户认证
查看>>
linux free
查看>>
Spring RedisTemplate操作-通道操作(10)
查看>>
Redis笔记系列(二)——Redis安装部署与维护详解
查看>>
Hibernate 持久化上下文总结
查看>>
XPath 与多线程爬虫
查看>>
MariaDB 很酷
查看>>
input和span对齐__笔记
查看>>
MySQL主从复制与读写分离
查看>>
Array类型
查看>>
Apache如何能够把可执行文件当成CGI程序来执行
查看>>
项目启动报 JDBC Driver has been forcibly unregistered
查看>>
【转载】ACID、Data Replication、CAP与BASE
查看>>
不争气的肚子
查看>>
Java并发编程高级篇(二):使用固定大小线程执行器
查看>>
我为什么鼓励工程师写blog
查看>>
Java HashMap实现详解
查看>>
ViewPager背景实现Parallax(平差化)效果
查看>>