阅读目录

Java反射API
Java反射指的是在运行状态时,能够获取类的属性和方法或者修改类运行时行为的过程。
java.lang.Class类提供了很多方法用于获取元数据、检查和改变类运行时的行为。
Java的反射主要涉及java.lang和java.lang.reflect包下的类。
反射应用场景举例
java.lang.Class类
java.lang.Class主要提供了以下两个功能:
java.lang.Class类常用方法
| Method | Description |
|---|---|
| 1) public String getName() | 返回类名 |
| 2) public static Class forName(String className)throws ClassNotFoundException | 加载类并返回Class对象 |
| 3) public Object newInstance()throws InstantiationException,IllegalAccessException | 创建实例对象 |
| 4) public boolean isInterface() | 判断是否是接口 |
| 5) public boolean isArray() | 判断是否是数组 |
| 6) public boolean isPrimitive() | 判断是否是原始数据类型 |
| 7) public Class getSuperclass() | 返回父类Class引用 |
| 8) public Field[] getDeclaredFields()throws SecurityException | 返回类的成员属性字段数组 |
| 9) public Method[] getDeclaredMethods()throws SecurityException | 返回类的方法数组 |
| 10) public Constructor[] getDeclaredConstructors()throws SecurityException | 返回类的构造方法数组 |
| 11) public Method getDeclaredMethod(String name,Class[] parameterTypes)throws NoSuchMethodException,SecurityException | 返回类中指定参数类型的方法 |
怎样获取Class对象
有三种方式,如下:
forName()方法示例
可用于动态加载,当你知道类的全限定名时,可以使用该方式。注意原始数据类型不适用该方法;
package tmp;
class Simple
{
}
public class Test
{
public static void main(String args[]) throws ClassNotFoundException
{
Class<?> c = Class.forName("tmp.Simple");
System.out.println(c.getName());
System.out.println(c.getSimpleName());
}
}
tmp.Simple Simple
getClass()方法示例:
从实例对象中获取Class对象
package tmp;
class Simple
{
}
public class Test
{
void printName(Object obj)
{
}
public static void main(String args[])
{
Simple s = new Simple();
Class<? extends Object> c = s.getClass();
System.out.println(c.getName());
System.out.println(c.getSimpleName());
}
}
tmp.Simple Simple
.class语法示例
作用于类名上,也可应用于原始数据类型,如下所示:
package tmp;
public class Test
{
public static void main(String args[])
{
Class<Boolean> c = boolean.class;
System.out.println(c.getName());
Class<Test> c2 = Test.class;
System.out.println(c2.getName());
}
}
boolean tmp.Test
判断Class对象对应的类型
以下方法可用于判断Class对象对应的类型:
| 1) public boolean isInterface(): 是否对应接口 |
| 2) public boolean isArray(): 是否对应数组 |
| 3) public boolean isPrimitive(): 是否对应原始数据类型 |
代码示例:
package tmp;
class Simple
{
}
interface My
{
}
public class Test
{
public static void main(String args[])
{
try
{
Class<?> c = Class.forName("tmp.Simple");
System.out.println(c.isInterface());
Class<?> c2 = Class.forName("tmp.My");
System.out.println(c2.isInterface());
}
catch (Exception e)
{
System.out.println(e);
}
}
}
false true
通过反射创建实例对象
有两种方式,如下:
所以,通常来讲,第二种方式比第一种使用范围更广。
Class对象调用newInstance()方法示例
package tmp;
class Simple
{
void message()
{
System.out.println("Hello Java");
}
}
public class Test
{
public static void main(String args[])
{
try
{
Class<?> c = Class.forName("tmp.Simple");
Simple s = (Simple) c.newInstance();
s.message();
}
catch (Exception e)
{
System.out.println(e);
}
}
}
Hello Java
Constructor对象调用newInstance()方法示例
注意这里可以根据传入参数的类型来得到指定的构造方法,还可以改变构造方法的访问权限限制。
package tmp;
import java.lang.reflect.Constructor;
class Simple
{
private String msg;
void message()
{
System.out.println("Hello Java," + msg);
}
private Simple(String s){
this.msg = s;
}
}
public class Test
{
public static void main(String args[])
{
try
{
Class<?> c = Class.forName("tmp.Simple");
Constructor<?> con = c.getDeclaredConstructor(String.class);
con.setAccessible(true);
Simple s = (Simple) con.newInstance("...");
s.message();
}
catch (Exception e)
{
System.out.println(e);
}
}
}
Hello Java,...
通过反射调用私有方法
通过反射,我们可以调用其它类的私有方法,主要涉及java.lang.Class和java.lang.reflect.Method类;
其中主要是用到了Method类的setAccessible方法和invoke方法,前者修改访问权限,后者调用方法。
通过调用有参私有方法示例:
package tmp;
import java.lang.reflect.Method;
class A
{
private void cube(int n)
{
System.out.println(n * n * n);
}
}
class Test
{
public static void main(String args[]) throws Exception
{
Class<A> c = A.class;
Object obj = c.newInstance();
Method m = c.getDeclaredMethod("cube", new Class[]{ int.class });
m.setAccessible(true);
m.invoke(obj, 4);
}
}
关于javap工具
使用javap命令可以反汇编java的字节码文件,展示class文件中的字段属性、构造方法、普通方法信息;
使用说明:
javap java.lang.Object示例
javap -c Test示例:
写个简单的Test类,如下:
package tmp;
class Simple
{
}
public class Test
{
public static void main(String args[])
{
System.out.println("Hello");
}
}
输入javap -c Test:
参考资料
基本属于翻译,做了小部分修改
http://www.javatpoint.com/java-reflection
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# java
# 反射
# java中的反射应用实现
# Java反射(Class类
# Class对象获取)
# java 利用反射机制
# 获取实体所有属性和方法
# 并对属性赋值
# Java如何通过反射获取私有构造、私有对象、私有字段、私有方法
# 加载
# 还可以
# 判断是否
# 参考资料
# 访问权限
# 可用于
# 当你
# 适用于
# 也可
# 各大
# 我们可以
# 可以使用
# 应用于
# 所示
# 有两种
# 可以根据
# 指的是
# 第二种
# 第一种
# 有三种
相关文章:
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
公司网站制作费用多少,为公司建立一个网站需要哪些费用?
如何打造高效商业网站?建站目的决定转化率
html制作网站的步骤有哪些,iapp如何添加网页?
长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?
如何获取免费开源的自助建站系统源码?
建站之星手机一键生成:多端自适应+小程序开发快速建站指南
高端云建站费用究竟需要多少预算?
如何在阿里云虚拟主机上快速搭建个人网站?
专业商城网站制作公司有哪些,pi商城官网是哪个?
视频网站制作教程,怎么样制作优酷网的小视频?
制作网站外包平台,自动化接单网站有哪些?
网站制作软件有哪些,制图软件有哪些?
建站之星免费模板:自助建站系统与智能响应式一键生成
定制建站价位费用解析与套餐推荐全攻略
设计网站制作公司有哪些,制作网页教程?
如何通过建站之星自助学习解决操作问题?
javascript基本数据类型及类型检测常用方法小结
如何获取PHP WAP自助建站系统源码?
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
招商网站制作流程,网站招商广告语?
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
魔方云NAT建站如何实现端口转发?
定制建站流程解析:需求评估与SEO优化功能开发指南
常州自助建站费用包含哪些项目?
可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?
北京制作网站的公司,北京铁路集团官方网站?
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
安徽网站建设与外贸建站服务专业定制方案
建站之星如何修改网站生成路径?
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
山东网站制作公司有哪些,山东大源集团官网?
Swift中swift中的switch 语句
如何快速建站并高效导出源代码?
制作充值网站的软件,做人力招聘为什么要自己交端口钱?
php条件判断怎么写_ifelse和switchcase的使用区别【对比】
SQL查询语句优化的实用方法总结
建站之星如何快速解决建站难题?
建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南
建站之星后台密码遗忘?如何快速找回?
建站主机与虚拟主机有何区别?如何选择最优方案?
如何通过NAT技术实现内网高效建站?
建站主机选购指南与交易推荐:核心配置解析
如何用VPS主机快速搭建个人网站?
香港服务器WordPress建站指南:SEO优化与高效部署策略
如何通过万网虚拟主机快速搭建网站?
c# 在高并发场景下,委托和接口调用的性能对比
php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】
开源网站制作软件,开源网站什么意思?
*请认真填写需求信息,我们会在24小时内与您取得联系。