阅读目录

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如何通过反射获取私有构造、私有对象、私有字段、私有方法
# 加载
# 还可以
# 判断是否
# 参考资料
# 访问权限
# 可用于
# 当你
# 适用于
# 也可
# 各大
# 我们可以
# 可以使用
# 应用于
# 所示
# 有两种
# 可以根据
# 指的是
# 第二种
# 第一种
# 有三种
相关文章:
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换
如何通过虚拟主机快速完成网站搭建?
如何制作网站标识牌,动态网站如何制作(教程)?
如何在Ubuntu系统下快速搭建WordPress个人网站?
建站VPS配置与SEO优化指南:关键词排名提升策略
宝盒自助建站智能生成技巧:SEO优化与关键词设置指南
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
建站之星如何防范黑客攻击与数据泄露?
如何配置IIS站点权限与局域网访问?
历史网站制作软件,华为如何找回被删除的网站?
,sp开头的版面叫什么?
高防服务器租用首荐平台,企业级优惠套餐快速部署
html制作网站的步骤有哪些,iapp如何添加网页?
如何在景安云服务器上绑定域名并配置虚拟主机?
如何在阿里云域名上完成建站全流程?
如何在阿里云高效完成企业建站全流程?
定制建站策划方案_专业建站与网站建设方案一站式指南
已有域名如何快速搭建专属网站?
如何快速查询网址的建站时间与历史轨迹?
网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?
兔展官网 在线制作,怎样制作微信请帖?
广德云建站网站建设方案与建站流程优化指南
焦点电影公司作品,电影焦点结局是什么?
武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
如何选择服务器才能高效搭建专属网站?
如何快速搭建虚拟主机网站?新手必看指南
建站上传速度慢?如何优化加速网站加载效率?
深圳网站制作培训,深圳哪些招聘网站比较好?
建站主机与服务器功能差异如何区分?
成都网站制作公司哪家好,四川省职工服务网是做什么用?
定制建站是什么?如何实现个性化需求?
外汇网站制作流程,如何在工商银行网站上做外汇买卖?
网站设计制作企业有哪些,抖音官网主页怎么设置?
定制建站模板如何实现SEO优化与智能系统配置?18字教程
建站主机功能解析:服务器选择与快速搭建指南
专业商城网站制作公司有哪些,pi商城官网是哪个?
定制建站价位费用解析与套餐推荐全攻略
Android自定义控件实现温度旋转按钮效果
SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?
javascript中的try catch异常捕获机制用法分析
建站与域名管理如何高效结合?
,网页ppt怎么弄成自己的ppt?
网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?
宝塔建站无法访问?如何排查配置与端口问题?
建站之星代理费用多少?最新价格详情介绍
官网自助建站平台指南:在线制作、快速建站与模板选择全解析
如何用PHP快速搭建CMS系统?
新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?
*请认真填写需求信息,我们会在24小时内与您取得联系。