文档章节

Java reflect-Java 反射

Oscarfff
 Oscarfff
发布于 2015/06/04 16:28
字数 404
阅读 58
收藏 0

一、通过reflect 实例化对象

按照老习惯,先上代码

package com.yuan.refletion;

class A {
	public int count;
    public int getCount() {
		return count;
	}
	public void setCount(int count) {
		this.count = count;
	}
	public A(int start) {
        count = start;
        System.out.println("A 构造方法:"+count);
    }
    public void increase(int step) {
        count = count + step;
    }
}

测试 Java 反射

package com.yuan.refletion;

import java.lang.reflect.*;

class B {
	public static void main(String args[]) {
		A Aa = new A(0); //一般做法
		Aa.increase(2);
		System.out.println("Normal -> " + Aa.getCount());
		try {
		    Constructor<A> constructor = A.class.getConstructor(int.class); //获取构造方法
		    A AReflect =(A)constructor.newInstance(10); //创建对象
		    Method method = A.class.getMethod("increase", int.class);  //获取方法
		    method.invoke(AReflect, 15); //调用方法
		    Field field = A.class.getField("count"); //获取域
		    System.out.println("Reflect -> " + field.getInt(AReflect)); //获取域的值
		} catch (Exception e) { 
		    e.printStackTrace();
		} 
	}
}

output:

A 构造方法:0

Normal -> 2

A 构造方法:10

Reflect -> 25

二、通过setAccessable 方法越过权限检查访问类里面的私有变量

package com.yuan.refletion;

class A {
	private int count;//设置为私有变量
        public int getCount() {
		return count;
	}
	public void setCount(int count) {
		this.count = count;
	}
	public A(int start) {
        count = start;
        System.out.println("A 构造方法:"+count);
    }
    public void increase(int step) {
        count = count + step;
    }
}

测试

package com.yuan.refletion;
import java.lang.reflect.*;
class B {
	public static void main(String args[]) {
		A Aa = new A(0); //一般做法
		Aa.increase(2);
		System.out.println("Normal -> " + Aa.getCount());
		try {
		    Constructor<A> constructor = A.class.getConstructor(int.class); //获取构造方法
		    A AReflect =(A)constructor.newInstance(10); //创建对象
		    Method method = A.class.getMethod("increase", int.class);  //获取方法
		    method.invoke(AReflect, 15); //调用方法
		    
		    Field field =A.class.getDeclaredField("count");//这个应该可以获取到所有的变量
		    //A.class.getField("count"); //获取域
		    field.setAccessible(true);//设置是否有权限获取
		    System.out.println("Reflect -> " + field.getInt(AReflect)); //获取域的值
		} catch (Exception e) { 
		    e.printStackTrace();
		} 
	}
}


本文转载自:http://www.infoq.com/cn/articles/cf-java-reflection-dynamic-proxy

共有 人打赏支持
上一篇: JAVA 事务处理
下一篇: java 笔试题
Oscarfff
粉丝 73
博文 815
码字总数 96913
作品 0
崇明
后端工程师
私信 提问
Java面试基础篇——第十篇:反射的原理

什么是Java的反射机制?指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法。对于任意一个对象,都能调用它的任意一个方法。这种动态获取信息,以及动态调用对象方法的功能叫Jav...

developlee的潇洒人生
07/24
0
0
08-《深度拆解JVM》之JVM是如何实现反射的?

一、问题引入 今天我们来讨论一下 Java 里的反射机制。反射是 Java 语言中一个相当重要的特性,它允许正在运行的 Java 程序观测,甚至是修改程序的动态行为。 举例来说,我们可以通过 Class ...

飞鱼说编程
10/12
0
0
【目录导航】JAVA零基础进阶之路

【JAVA零基础入门系列】(已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day6 Java字符串 Day7 Java输入与输出...

MFrank
06/21
0
0
最最最常见的Java面试题总结——第二周

String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的? String和StringBuffer、StringBuilder的区别 可变性   String类中使用字符数组:保存字符串,所以String对象是...

Amsour丶
08/13
0
0
【Java学习路线】新手该如何一步步的学习 Java

新手该如何一步步的学习 Java? 如果真的想学Java,最好要循序渐进,有章有法的学习它! 今天小慕就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容。 首先,给大家分享一张以 企业...

Eddie_yang
11/15
131
0

没有更多内容

加载失败,请刷新页面

加载更多

局域网共享文件读写的实现方式

首先是设置共享目录,支持用户和密码等权限控制 然后我们可以使用Windows资源管理器操作共享目录下的文件 这中间隐藏了资源管理器帮我们建立目录映射和连接的过程,如果设置了用户名和密码,...

夏至如沫
19分钟前
2
0
Elasticsearch安装与配置

一、Docker安装ES 开发模式 可以使用以下命令快速启动Elasticsearch以进行开发或测试: $ docker run -p 9200:9200 -p 9300:9300 -d --name es -e "discovery.type=single-node" docker.ela...

吴伟祥
25分钟前
1
0
移动页面滚动穿透解决方案(荐)

移动页面滚动穿透解决方法目前有多种解决方案,我介绍下几种方案: 解决方案1:阻止冒泡。 //关键代码$(".sliders,.modals").on("touchmove",function(event){    event.preventDefau...

壹峰
26分钟前
0
0
调用infura实现java项目调用智能合约

https://infura.io/dashboard 注册一个帐号 添加一个project 可选择主网或者其他网络,然后复制地址放进pom.xml中 复制智能合约地址复制到pom.xml中 复制任意一个帐号的private key到pom.xml...

八戒八戒八戒
33分钟前
3
0
vue+koa2+token 登录验证

https://segmentfault.com/a/1190000017379244?utm_source=weekly&utm_medium=email&utm_campaign=email_weekly...

Js_Mei
36分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部