Java提升篇之反射的原理
Java提升篇之反射的原理
import java.lang.reflect.Constructor;
public class ReflectConstructor {
public static void main(String[] args) throws Exception {
Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuffer.class);
Object str = constructor.newInstance(new StringBuffer("你好"));//实例化一个对象
System.out.println(str);
}
}
2、成员变量的反射
import java.lang.reflect.*;
public class ReflectField {
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("反射.ReflectPoint");
Constructor constructor = clazz.getConstructor(int.class,int.class);
Object obj = constructor.newInstance(3,5);//用字节码对象实例化一个Object对象,然后通过该对象来操作成员变量
Field fieldy=obj.getClass().getField("y");//fieldy不是对象(pt)身上的变量,而是类(Field)上的,要用它去取某个对象上对应的值
System.out.println(fieldy.get(obj));
Field fieldx=obj.getClass().getDeclaredField("x");//对于一个类里面的私有字段,要用getDeclaredField()方法获取
fieldx.setAccessible(true);//要取得一个私有字段上的值,必须设置为true
fieldx.set(obj,2);//修改某个对象上对应私有字段的值
System.out.println(fieldx.get(obj));
System.out.println(obj.toString());
}
}
class ReflectPoint {
private int x;
public int y;
public ReflectPoint(int x, int y) {
super();
this.x = x;
this.y = y;
}
public ReflectPoint() {
super();
}
@Override
public String toString() {
return "ReflectPoint [x=" + x + ", y=" + y + "]";
}
}
}
【注:在应用反射时,最好都用getDeclared****()方法获取相应的Constructor、Field、Method,因为你不知道它们对应的权限是什么,通过这个方法可以越过权限检查,全部获取到,在获取成员变量时也都设置这个fieldx.setAccessible(true),设置为true,即可以访问,越过权限检查】
3、成员方法的反射
import java.lang.reflect.Method;
public class ReflectMethod {
public static void main(String[] args) throws Exception {
//Method[] method = String.class.getMethods();//获取自己包括父亲的公共方法
//Method[] method2 = String.class.getDeclaredMethods();//获取自己的所有方法
Method method = String.class.getMethod("charAt", int.class); //getMethod(String,Class<...>)第一个参数为方法名,第二个为该方法的参数类型字节码
char str = (char) method.invoke( new String("abcd"), 2); //invoke()意为调用
/*
* invoke(Object,args)第一个参数表示对象是谁(如果被调用的method不是静态方法则传入一个调用chaAt()方法的对象,
* 如果被调用的是静态方法,比如main()方法等,则invoke(null,args)第一个参数传入null),
* 第二个表示调用该方法所传入的实际参数(注意:当第二个参数为String[]类型时,必须用Object[]对象把String[]对象包在里面,即new Object{new String[]{"a","b",....}},因为如果传入String[]类型对象java会把这个对象自动拆包,这就导致传入了多个参数,即报参数数目不匹配异常。如果传入的是int[]对象的话,这个可以用new int[]{}来传入,见下面例子)
* */
System.out.println(str);
Test test = new Test();
Method method2 = test.getClass().getMethod("main", String[].class);
method2.invoke(null,new Object[]{new String[]{"1","2","3"}});//调用的是静态方法,则invoke(null,args)第一个参数传入null
}
}
class Test{
public static void sum(int[] a){
for(int arg : a){
System.out.println(arg);
}
}
public static void main(String[] args) {
for(String arg : args){
System.out.println(arg);
}
}
}
4、数组的反射
import java.lang.reflect.Array;
public class ReflectArray {
public static void main(String[] args) {
printObject(new String[]{"aaa","bbb"});
printObject(111);
}
private static void printObject(Object obj) {
Class cla = obj.getClass();
if(cla.isArray()){//判断传入过来的对象是否为数组,是数组对象则遍历输出值
int len = Array.getLength(obj);
for(int i=0;i<len;i++){
System.out.println(Array.get(obj, i));
}
}else{//如果不是数组对象,则直接输出值
System.out.println(obj);
}
}
}
————转载请注明出处
Java提升篇之反射的原理的更多相关文章
- Java提升篇之反射的原理(二)
Java提升篇之通过反射越过泛型检查 /* *问题:在一个ArrayList<Integer>对象中,在这个集合中添加一个字符串. */ 在我们还没有学反射前,遇到这个问题都是无法实现的, ...
- 【JAVA - 基础】之反射的原理与应用
一.反射简介 反射机制指的是程序在运行时能够获取自身的信息.在JAVA中,只要给定类的名字,那么就可以通过反射机制来获取类的所有信息. 1.反射的应用 JDBC编程中的:Class.forName(& ...
- Java基础篇——JVM之GC原理(干货满满)
原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10697554.html ,多多支持哈! 一.什么是GC? GC是垃圾收集的意思,内存处理是 ...
- java框架篇---spring IOC 实现原理
IOC(DI):其实这个Spring架构核心的概念没有这么复杂,更不像有些书上描述的那样晦涩.java程序员都知道:java程序中的每个业务逻辑至少需要两个或以上的对象来协作完成,通常,每个对象在使用 ...
- Java 基础篇之反射
反射 使用反射获取程序运行时的对象和类的真实信息. 获取 Class 对象 每个类被加载之后,系统会为该类生成一个对应的 Class 对象,通过该 Class 对象可以访问到 JVM 中的这个类. 使 ...
- java框架篇---spring AOP 实现原理
什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入 ...
- Java安全第一篇 | 反射看这一篇就够了
什么是反射? Java安全可以从反序列化漏洞说起,反序列化漏洞又可以从反射说起.反射是⼤多数语⾔⾥都必不可少的组成部分,对象可以通过反射获取他的类,类可以通过反射拿到所有⽅法(包括私有),拿到的⽅法可 ...
- ReflectASM-invoke,高效率java反射机制原理
前言:前段时间在设计公司基于netty的易用框架时,很多地方都用到了反射机制.反射的性能一直是大家有目共睹的诟病,相比于直接调用速度上差了很多.但是在很多地方,作为未知通用判断的时候,不得不调用反射类 ...
- Java高级篇(四)——反射
之前写到了设计模式的代理模式,因为下一篇动态代理等内容需要用到反射的知识,所以在之前Java篇的基础上再写一篇有关反射的内容,还是以实际的程序为主,了解反射是做什么的.应该怎么用. 一.什么是反射 反 ...
随机推荐
- [Codeforces 961G]Partitions
Description 题库链接 给你 \(n\) 个不同的元素组成的集合 \(R\) ,每个元素有一个权值 \(w\) .对于一个子集集合 \(S\) ,它的价值为 \(W(S)=|S|\cdot\ ...
- 音频自动增益 与 静音检测 算法 附完整C代码
前面分享过一个算法<音频增益响度分析 ReplayGain 附完整C代码示例> 主要用于评估一定长度音频的音量强度, 而分析之后,很多类似的需求,肯定是做音频增益,提高音量诸如此类做法. ...
- SpringBoot多环境部署,在启动时动态设置相应的配置文件
项目中,往往在测试环境和正式环境拥有不同的配置,例如数据库连接,第三方库的appkey等.这时候,我们就要在不同的环境启用不同的配置 下面新建三个文件,分别表示开发环境,生产环境和测试环境的配置文件 ...
- [TensorFlow 团队] TensorFlow 数据集和估算器介绍
发布人:TensorFlow 团队 原文链接:http://developers.googleblog.cn/2017/09/tensorflow.html TensorFlow 1.3 引入了两个重 ...
- USB_ESD处理
今天收到客户反馈说碰到USB后机器会死机,之前一直没有关注ESD问题. 现在整理之前用过的成熟的ESD电路: 电感为 PZ3216D101-3R0TF,1206封装. 用ESD枪测试OK, 用打火机持 ...
- python中decode
这 是因为遇到了非法字符--尤其是在某些用C/C++编写的程序中,全角空格往往有多种不同的实现方式,比如\xa3\xa0,或者\xa4\x57,这些 字符,看起来都是全角空格,但它们并不是" ...
- 阿里 & 酷家乐:实习生面试
最近海投了十家公司,暂时有阿里两面(已凉).酷家乐两面(大概凉了).网易一面.前两个都是基础知识发挥得还可以,两家公司二面都凉凉. 阿里一面(3.21 26min) 刚好买了中饭回宿舍打开正准备吃的时 ...
- JSON.parse()在火狐中的BUG
//用sessionStorage解决load页面刷新问题 { //sessionStorage.removeItem("loadInfo"); var loadInfo=de ...
- 关于 printf scanf getchar
float默认小数6位 右对齐.-m 左对齐 在调用printf函数输出数据时,当数据的实际位宽大于printf函数中的指定位宽时,将按照数据的实际位宽输出数据. .n表精度 输出%符号 注意点 #i ...
- 详解linux进程间通信-管道 popen函数 dup2函数
前言:进程之间交换信息的唯一方法是经由f o r k或e x e c传送打开文件,或通过文件系统.本章将说明进程之间相互通信的其他技术-I P C(InterProcess Communication ...