java_reflect_02
按我们所知道的.对于类中的method,constructor,field如果访问属性是private的情况下我们是访问不了的,但通过反射就可以做到
仔细分析api发现Method,Constructor,Field这三个类全都继承了java.lang.reflect.AccessibleObject
AccessibleObject 类是 Field、Method 和 Constructor 对象的基类。它提供了将反射的对象标记为在使用时取消默认 Java 语言访问控制检查的能力。对于公共成员、默认(打包)访问成员、受保护成员和私有成员,在分别使用 Field、Method 或 Constructor 对象来设置或获取字段、调用方法,或者创建和初始化类的新实例的时候,会执行访问检查。
在反射对象中设置 accessible 标志允许具有足够特权的复杂应用程序(比如 Java Object Serialization 或其他持久性机制)以某种通常禁止使用的方式来操作对象。
一,创建一个Field,Method,Constructor全为private的po类
package po; public class User2 {
private String name="wangyang";
private User2(){ }
private String getName(){
return this.name;
}
}
二,通过反射来调用里面的属性,方法
@Test
public void test02() throws Exception{
Class<?> clazz=Class.forName("po.User2");
Constructor c=clazz.getDeclaredConstructor(null);
c.setAccessible(true);
Object newInstance = c.newInstance(null);
Field name=clazz.getDeclaredField("name");
name.setAccessible(true);
System.out.println(name.get(newInstance));
//wangyang
Method m=clazz.getDeclaredMethod("getName", null);
m.setAccessible(true);
System.out.println(m.invoke(newInstance, null));
//wangyang
}
我们可以发现也可以全部实现效果
如果想用反射修改访问控制检查的话,获取Method和Field对象的时候一定要用getDeclaredField和getDeclaredMethod。不要用getField和getMethod。
虽然这两个方法的参数都是相同的,但不同点在于getMethod和getField只能获得public修饰的属性和方法。而getDeclared可以获取任何类型的属性和方法,因为这个例子要调用私有的属性和方法,所以要用getDeclaredXX。
java_reflect_02的更多相关文章
随机推荐
- 14.5.3 Locks Set by Different SQL Statements in InnoDB
14.5.3 Locks Set by Different SQL Statements in InnoDB 通过不同的SQL语句设置的锁 在InnoDB中 一个锁定读, 一个UPDATE 或者一个D ...
- VIM default configuration
== Vim的行号.语法显示等设置(.vimrc文件的配置) ==2008年01月18日 星期五 23:01 在终端下使用vim进行编辑时,默认情况下,编辑的界面上是没有显示行号.语法高亮度显示.智能 ...
- HDOJ(HDU) 2317 Nasty Hacks(比较、)
Problem Description You are the CEO of Nasty Hacks Inc., a company that creates small pieces of mali ...
- openSession和getCurrentSession的比较
在比较openSession和getCurrentSession这两个方法之前,我们先认识一下这两个方法. 在进行配置信息管理时,我们一般进行一下简单步骤: Configuration cfg = n ...
- ssh非交互式密码输入
ssh登陆不能在命令行中指定密码.sshpass的出现,解决了这一问题.sshpass用于非交互SSH的密码验证,一般用在sh脚本中,无须再次输入密码. 它允许你用 -p 参数指定明文密码,然后直接登 ...
- 301重定向与CNAME
CNAME记录是域名指向另一个域名A记录是域名指向IP地址URL跳转是打开这个网址的时候会跳转到另一个指定的网址,URL跳转分为301永久重定向和302临时重定向. 301永久重定向会使搜索引擎抓取新 ...
- ruby 安装 运行
Ruby基础 一 简介 1.Ruby在windows平台下的安装 (1)下载地址:http://rubyinstaller.org/downloads/ (2)安装过程 这里我们选择安装路径为 D:\ ...
- 只对safari起作用的css hack
下面的css代码只对safari browser 起作用: .test { width: 200px; height:50px; background-color:red; padding-top: ...
- oracle 零散知识汇集
1. Select '登陆' + 2 From dual会报错: ora- 01722 无效数字,原理是oracle把'登陆'当成数字来和2进行加法运算. Select '登陆'|| 2 From d ...
- 设置IIS7文件上传的最大大小 maxAllowedContentLength,maxRequestLength
当上传一个超过30M的文件时,服务器会重定向至404.13页面,报错如下: HTTP Error 404.13 - Not Found The request filtering module is ...