大家好,小乐继续接着上集:乐字节Java反射之一:反射概念与获取反射源头Class

这次是之二:实例化对象、接口与父类、修饰符和属性

一:实例化对象

之前我们讲解过创建对象的方式,有new 、克隆、反序列化,再加一种,根据Class对象,使用newInstance() 或者构造器实例化对象。调用以下api即可

 //获取源头
Class<?> clz = Class.forName("com.shsxt.ref.simple.User");
//第一种:通过newInstance()创建对象
User user=(User)clz.newInstance();
user.setUname("sxt");
user.setUpwd("good");
//第二种:通过getDeclaredConstructors()创建对象,取得全部构造函数(注意顺序)
Constructor<?>[] cons=clz.getDeclaredConstructors();
for(Constructor<?>c:cons){
System.out.println(c);
}
//注意观察上面的输出结果,再实例化,否则参数容易出错
User u1=(User)cons[0].newInstance("shsxt","good");
User u2=(User)cons[1].newInstance("sxt");
User u3=(User)cons[2].newInstance();
System.out.println(u1.getUname()+u1.getUpwd());

注意:newInstance()是调用空构造,如果空构造不存在,会出现异常。由此可知,使用其他构造器创建对象比较麻烦,使用空构造非常简单。确保空构造存在 。

二、 接口与父类

通过api获取接口与父类

 //获取源头
Class<?> clz =Class.forName("com.shsxt.ref.simple.User");
//获取所有接口
Class<?>[] inters=clz.getInterfaces();
for(Class<?> in:inters){
System.out.println(in.getName());
}
//获取父类
Class<?> cls=clz.getSuperclass();
System.out.println("继承的父类为:"+cls.getName());

三、 修饰符

获取修饰符,使用Modifier即可

 Class<?>clz=Class.forName("com.shsxt.ref.simple.User");
//获得修饰符
int n=clz.getModifiers();
//使用Modifier转换为相应的字符串
System.out.println(Modifier.toString(n));

四、 属性

获取所有属性(包括父类或接口) ,使用Field 即可操作

 Class<?> clz = Class.forName("com.shsxt.ref.simple.User");
//获取属性
System.out.println("===============本类属性==========");
// 取得本类的全部属性
Field[] field = clz.getDeclaredFields();
for (int i = 0; i < field.length; i++) {
// 1、权限修饰符
int mo = field[i].getModifiers();
String vis = Modifier.toString(mo);
// 2、属性类型
Class<?> type = field[i].getType();
//3、名字
String name = field[i].getName();
System.out.println(vis + " " + type.getName() + " "+ name + ";");
}
System.out.println("=========公开的属性包括接口或者父类属性======");
field = clz.getFields();
for (int i = 0; i < field.length; i++) {
System.out.println(field [i]);
}
 

乐字节原创,转载请注明出处

Java反射机制后续会继续讲述,欢迎关注 乐字节

最新文章

  1. 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用
  2. 定制Eclipse IDE之插件篇(一)
  3. Maven-eclipse运行maven命令
  4. windows核心编程---第五章 线程的基础
  5. 多线程技术 NSThread &amp; NSOperation &amp; GCD
  6. bzoj 1295: [SCOI2009]最长距离 暴力+bfs最短路
  7. C#几种截取字符串的方法小结
  8. Java基础知识强化之IO流笔记68:Properties和IO流集合使用
  9. [Angular 2] A Simple Form in Angular 2
  10. textarea
  11. django学习之Model(四)MakingQuery
  12. redis特性 存储 API 集群 等
  13. HTML5新增特性
  14. 判断鼠标进入容器的方向小Demo
  15. Android后台处理最佳实践(Best Practices for Background Jobs)
  16. Atitit tomcat在linux服务器的启动与其他
  17. SQL SERVER 聚集索引 非聚集索引 区别
  18. VHF、UHF的频率范围
  19. playbook详解—YAML格式的文本
  20. LeetCode301. Remove Invalid Parentheses

热门文章

  1. 微信小程序向本地保存
  2. JavaScript 字符串转数字(整数,浮点数,进制转换)
  3. Spring框架中不同类型的事件
  4. Java 面向对象(三)
  5. java Calendar 小时值得到24进制格式
  6. selinux 开启和关闭
  7. 利用pathMeasure实现路径动画
  8. VisualStudio版本号
  9. linux简单命令4---压缩与解压
  10. 用Dev C++编写第一个C语言程序