Java提升篇之反射的原理

1、构造方法的反射
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提升篇之反射的原理的更多相关文章

  1. Java提升篇之反射的原理(二)

    Java提升篇之通过反射越过泛型检查 /* *问题:在一个ArrayList<Integer>对象中,在这个集合中添加一个字符串. */ 在我们还没有学反射前,遇到这个问题都是无法实现的, ...

  2. 【JAVA - 基础】之反射的原理与应用

    一.反射简介 反射机制指的是程序在运行时能够获取自身的信息.在JAVA中,只要给定类的名字,那么就可以通过反射机制来获取类的所有信息. 1.反射的应用 JDBC编程中的:Class.forName(& ...

  3. Java基础篇——JVM之GC原理(干货满满)

    原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10697554.html ,多多支持哈! 一.什么是GC? GC是垃圾收集的意思,内存处理是 ...

  4. java框架篇---spring IOC 实现原理

    IOC(DI):其实这个Spring架构核心的概念没有这么复杂,更不像有些书上描述的那样晦涩.java程序员都知道:java程序中的每个业务逻辑至少需要两个或以上的对象来协作完成,通常,每个对象在使用 ...

  5. Java 基础篇之反射

    反射 使用反射获取程序运行时的对象和类的真实信息. 获取 Class 对象 每个类被加载之后,系统会为该类生成一个对应的 Class 对象,通过该 Class 对象可以访问到 JVM 中的这个类. 使 ...

  6. java框架篇---spring AOP 实现原理

    什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入 ...

  7. Java安全第一篇 | 反射看这一篇就够了

    什么是反射? Java安全可以从反序列化漏洞说起,反序列化漏洞又可以从反射说起.反射是⼤多数语⾔⾥都必不可少的组成部分,对象可以通过反射获取他的类,类可以通过反射拿到所有⽅法(包括私有),拿到的⽅法可 ...

  8. ReflectASM-invoke,高效率java反射机制原理

    前言:前段时间在设计公司基于netty的易用框架时,很多地方都用到了反射机制.反射的性能一直是大家有目共睹的诟病,相比于直接调用速度上差了很多.但是在很多地方,作为未知通用判断的时候,不得不调用反射类 ...

  9. Java高级篇(四)——反射

    之前写到了设计模式的代理模式,因为下一篇动态代理等内容需要用到反射的知识,所以在之前Java篇的基础上再写一篇有关反射的内容,还是以实际的程序为主,了解反射是做什么的.应该怎么用. 一.什么是反射 反 ...

随机推荐

  1. [Codeforces 100633J]Ceizenpok’s formula

    Description 题库链接 求 \[C_n^m \mod p\] \(1\leq m\leq n\leq 10^{18},2\leq p\leq 1000000\) Solution 一般的 \ ...

  2. [Awson原创]修水渠(canal)

    Description Awson是某国际学校信竞组的一只菜鸡.他们班主任F老师喜欢带他们去爬爬唷喽山.登顶后,Awson有了个奇怪的发现. 山腰上有N(1<=N<=100)个村庄,这些村 ...

  3. [UVa 1326]Jurassic Remains

    题解 在一个字符串中,每个字符出现的次数本身是无关紧要的,重要的只是这些次数的奇偶性,因此想到用一个二进制的位表示一个字母($1$表示出现奇数次,$0$表示出现偶数次).比如样例的$6$个数,写成二进 ...

  4. hihocoder 1419 重复旋律4

    描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列.小Hi在练习过很多曲子以后发现很多作品中的旋律有重复的部分. 我们把一段旋律称为(k,l)-重复的, ...

  5. [BZOJ1977]严格次小生成树

    [问题描述] 小C最近学了很多最小生成树的算法,Prim算法.Kurskal算法.消圈算法等等. 正当小C洋洋得意之时,小P又来泼小C冷水了.小P说,让小C求出一个无向图的次小生成树,而且这个次小生成 ...

  6. bzoj 3244: [Noi2013]树的计数

    Description 我们知道一棵有根树可以进行深度优先遍历(DFS)以及广度优先遍历(BFS)来生成这棵树的DFS序以及BFS序.两棵不同的树的DFS序有可能相同,并且它们的BFS序也有可能相同, ...

  7. ●CodeChef Sereja and Game

    题链: https://www.codechef.com/problems/SEAGM题解: 概率dp,博弈论 详细题解:http://www.cnblogs.com/candy99/p/650434 ...

  8. hdu 5011(博弈)

    题意:在许多堆石子中,两人轮流取,1.在一堆中取至少一个  2.将这一堆分成两堆 思路:NIM游戏,所有值的异或,当其为0时失败 nim游戏: 假设只有两堆,游戏人取得胜利并不在于N1和N2的值具体是 ...

  9. APIO 2016

    我好菜啊都不会 T1.boats 题目大意:给你N段区间,按顺序决定每段区间可以选一个数或不选,若选则选的这个数必须大于所有在这之前选的数,求有多少种方案.(N<=500,区间在[1,1e9]范 ...

  10. salt基本使用之一(1)

    1.帮助文档 以cmd函数为例子说下salt中的一些帮助信息 # 查看指定modules用法 salt '*' sys.doc cmd # 查看所有的modules列表 salt '*' sys.li ...