Java之反射 — 用法及原理
Java之反射 — 用法及原理
定义
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。
用途
在日常的第三方应用开发过程中,经常会遇到某个类的某个成员变量、方法或是属性是私有的或是只对系统应用开放,这时候就可以利用Java的反射机制通过反射来获取所需的私有成员或是方法。当然,也不是所有的都适合反射,有时可能会碰到一些情况无法正确的反射,是因为经过层层调用后在最终返回结果的地方对应用的权限进行了校验,对于没有权限的应用返回值是没有意义的缺省值,否则返回实际值起到保护用户的隐私目的。
代码示例
public static void main(String[] args)
throws ClassNotFoundException,
IllegalAccessException,
InstantiationException,
NoSuchMethodException,
InvocationTargetException, NoSuchFieldException {
// 通过反射创建对象
Class<?> personClass = Class.forName("edu.sfls.Jeff.JavaDev.Person");
Object obj = personClass.newInstance();
Person person = (Person) obj;
person.str1 = "Hello World!";
person.print_str1();
// 反射private构造器
Constructor<?> personConstructor = personClass.getDeclaredConstructor(String.class, String.class);
personConstructor.setAccessible(true);
Person person2 = (Person) personConstructor.newInstance("abc", "abcd");
person2.print_str1_and_2();
// 反射私有属性
Field fieldA = personClass.getDeclaredField("a");
fieldA.setAccessible(true);
int a = fieldA.getInt(person);
System.out.println(a);
// 反射私有方法
Method methodPrint = personClass.getDeclaredMethod("print_a_b_c", int.class);
methodPrint.setAccessible(true);
methodPrint.invoke(person, 100);
}
// 被反射的类
class Person {
String str1;
String str2;
private int a = 1, b = 2, c = 3;
public Person() {}
private Person(String str1, String str2) {
this.str1 = str1;
this.str2 = str2;
}
private void print_a_b_c(int d) {
System.out.println(a + " " + b + " " + c + " " + d);
}
public void print_str1() {
System.out.println(str1);
}
public void print_str1_and_2() {
System.out.println(str1 + " " + str2);
}
}
Java之反射 — 用法及原理的更多相关文章
- java this的用法以及原理
/** * this存在方法中,在方法中被调用. * 且是非static方法中被调用.(this 表示这个类的当前实例,而静态方法不依赖于该类的任何实例,随着类产生而装载,因此方法内不能引用 this ...
- Java static的用法以及原理(06)
静态:static 用法:是一个修饰符,用于修饰成员(成员变量,成员函数), 当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,还可以直接被类名调:类名.静态成员 类名.静态成员 存在:方 ...
- JAVA的反射机制原理
http://www.cnblogs.com/hongxinlaoking/p/4684652.html 一 反射机制的概念: 指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于 ...
- 不藏了,这些Java反射用法总结都告诉你们
摘要:Java反射是一种非常强大的机制,它可以在同一个系统中去检测内部的类的字段.方法和构造函数.它非常多的Java框架中,都大量应用了反射技术,如Hibernate和Spring.可以说,反射机制的 ...
- Java注解(Annotation)用法:利用注解和反射机制指定列名导出数据库数据
闲来没事,想了一个应用的例子:用java如何把数据库的数据根据我们指定的某几列,如第2列,第4列,第6列导出来到Excel里? 写代码也是为了应用的,写好的代码更重要的是在于思考.我自己思考了这个示例 ...
- Java线程:概念与原理
Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程 ...
- Java Spring IOC用法
Java Spring IOC用法 Spring IoC 在前两篇文章中,我们讲了java web环境搭建 和 java web项目搭建,现在看下spring ioc在java中的运用,开发工具为In ...
- 四种Java线程池用法解析
本文为大家分析四种Java线程池用法,供大家参考,具体内容如下 http://www.jb51.net/article/81843.htm 1.new Thread的弊端 执行一个异步任务你还只是如下 ...
- Java 之 反射
1.反射 a.意义:允许运行中的Java程序对自身进行检查,或者说"自审",并能直接操作程序的内部属性 b.概括:运行时探究和使用编译时未知的类 c.反射的核心原理: ①JVM在加 ...
随机推荐
- New Airless Pump Bottle Technical Features
Airless Pump Bottle protect sensitive products such as natural skin creams, serums, foundations a ...
- robot framework 接口post请求需要加headers
说明:当你用RF进行post接口测试时候,那么需要加个headers=Content-Type=application/x-www-form-urlencoded,要不然会请求不成功的.
- string和 new string的区别
栈区 存 引用和基本类型,不能存对象,而堆区存对象.==是比较地址,equals()比较对象内容. (1) String str1 = "abcd"的实现过程:首先栈区创建 ...
- 十二 INPUT逻辑视图的配置,回显错误信息
Action接口中提供了五个逻辑视图的名称 SUCCESS ERROR LOGIN INPUT:input在某些拦截器会使用 NONE 配置逻辑视图:struts_demo2.xml,配置后出现错误信 ...
- 华为云WeLink 颠覆你对智能办公的想象
导读 华为云发现,与企业数字化关系最紧密的就是办公数字化,所以将WeLink放到华为云上可以作为一个抓手让企业更直观地感受到云端数字化,而且华为云的合作伙伴,也可以与WeLink建立联接,从而进整个企 ...
- c3p0 获取数据源
getDataSourcec3p0Resource private static void f3Resource() throws Exception { Connection conn = getD ...
- C++中的随机数
事情的开始是这样的,在大二的时候,写了几种排序算法,为了测试,就要为数组(或者容器)赋予一些随机初值,自然就用到了C/C++中的随机函数. 当时为了调用简单,将随机数赋值的过程写到了一个单独的函数里, ...
- elasticsearch mapping简单介绍
这两天一直在看elasticsearch相关的内容,看到mapping这一块,就折腾了下. 一般情况下,我们不需要对elasticsearch的mapping进行设置,但如果希望对索引使用自定义的管理 ...
- 配置web应用全局的错误页面
- USACO January Contest Gold Time is Mooney 题解
题意 给出一个有向图,走到每个节点有 \(m_i\) 的收益,每一条边要走一天,走 \(T\) 天的花费是 \(C\cdot T^2\),求从节点 \(1\) 开始并且在节点 \(1\) 结束的旅行的 ...