博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 反射 想
阅读量:7104 次
发布时间:2019-06-28

本文共 6635 字,大约阅读时间需要 22 分钟。

所谓反射。是指在执行时状态中,获取类中的属性和方法。以及调用当中的方法的一种机制。

这样的机制的作用在于获取执行时才知道的类(Class)及当中的属性(Field)、方法(Method)以及调用当中的方法,也能够设置当中的属性值。

在Java中实现反射最重要的一步,也是第一步就是获取Class对象,得到Class对象后能够通过该对象调用对应的方法来获取该类中的属性、方法以及调用该类中的方法。
Java中反射有例如以下几种实现方式:
1、通过Class.forName()方法载入字符串,就能够得到该字符串做代表的Class对象。

比如:Class<?

> clazz = Class.forName("java.lang.String")就能够得到String类的Class对象。

值得注意的是,字符串必须是类的全名。即包名+类名。

下边的代码是Struts配置文件struts.xml中的一个action的配置。

 
   
/registeResult.jsp
   
/registe2.jsp
 
这里的class属性给出了一个类的全名的字符串,server是怎样通过这个字符串得到类对象的呢?就是通过反射机制RegisteAction对象的。

然后再去调用这个类中的默认的execute()方法。

2、通过类名调用class属性得到该类的Class对象。
比如:Class<?> clazz = String.class也能够得到String类的Class对象。

3、调用实例的getClass()方法。
比如:Date date = new Date();
          Class<?> clazz = date.getClass();
通过上边的两句代码就能够得到date实例的Class对象。
1 获取 反射的对象
package com.qianfeng.reflect;import com.qianfeng.domain.Person;/*反射:动态获取类或类中成员。并使用类或类中成员获取一个类字节码文件对象的方式 (类名的.class)*/public class ReflectDemo1 {	public ReflectDemo1() {		// TODO Auto-generated constructor stub	}	public static void main(String[] args) throws ClassNotFoundException {		        								//get1();				//get2();		          get3();	}	private static void get3() throws ClassNotFoundException {		//通过字符串形式的名称来获取字节码文件对象,不须要对象。也不须要类		Class claz = Class.forName("com.qianfeng.domain.Person");		System.out.println(claz);							}	private static void get2() {		//每一个数据类型都有一个class属性,能够通过类的该属性获取其所属类的字节码文件对象		//不须要对象。可是须要类		Class claz = Person.class;		Class claz2 = Person.class;				System.out.println(claz==claz2);					}	private static void get1() {		//方式一:通过对象来获取所属类的字节码文件对象		//不论什么一个对象都有其所属类的字节码文件对象		//new Person()  Person.class		//特点:这样的方式须要创建对象		Person p1 = new Person();		Class claz1 = p1.getClass();//Person.class		Person p2 = new Person();		Class claz2 = p2.getClass();//Person.class		System.out.println(claz1==claz2);			}}
2  获取反射的对象的构造方法
package com.qianfeng.reflect;import java.lang.reflect.Constructor;import java.lang.reflect.InvocationTargetException;import com.qianfeng.domain.Person;public class ReflectDemo2 {	/**	 * @param args	 * @throws ClassNotFoundException 	 * @throws IllegalAccessException 	 * @throws InstantiationException 	 * @throws SecurityException 	 * @throws NoSuchMethodException 	 * @throws InvocationTargetException 	 * @throws IllegalArgumentException 	 */	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {		//动态获取类。并创建对象        		createObj();				createObj2();	}	private static void createObj2() throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {		//动态获取类		String str="com.qianfeng.domain.Person";		Class claz = Class.forName(str);		//int.class;		//使用带參数的构造方法创建对象		//首先要得到带參数的构造方法		//Person p = new Person("lsdjkf",34);//String.class int.class				Constructor con = claz.getConstructor(String.class,int.class);				//使用获取到的构造方法创建对象				Object obj = con.newInstance("李四",29);//调用构造方法对象的newInstance()方法				System.out.println(obj);							}	private static void createObj() throws ClassNotFoundException, InstantiationException, IllegalAccessException {		//Person p = new Person();		//1载入Person.class  2:开辟内存  3:构造方法				//动态获取类		String str="com.qianfeng.domain.Person";		Class claz = Class.forName(str);				//创建对象		Object obj = claz.newInstance();//调用这个字节码文件对象的newInstance()方法				System.out.println(obj);			}}
3 获取对象中的成员变量
package com.qianfeng.reflect;import java.lang.reflect.Field;public class ReflectDemo3 {	/**	 * @param args	 * @throws ClassNotFoundException 	 * @throws SecurityException 	 * @throws NoSuchFieldException 	 * @throws IllegalAccessException 	 * @throws InstantiationException 	 */	public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException, InstantiationException, IllegalAccessException {		// 动态获取类并创建对象后。訪问成员属性				accessField();	}	private static void accessField() throws ClassNotFoundException, NoSuchFieldException, SecurityException, InstantiationException, IllegalAccessException {		//Person p = new Person();		//p.name = "";		//动态获取类		String str="com.qianfeng.domain.Person";		Class claz = Class.forName(str);				//获取字段		//Field f = claz.getField("name");//仅仅能获取权限是public的字段		Field f = claz.getDeclaredField("name");		//System.out.println(f);				//给字段赋值--须要先有对象		//创建对象		Object obj = claz.newInstance();				//设置权限为可訪问的				f.setAccessible(true);//暴力訪问		//给字段赋值				f.set(obj, "小花");				System.out.println(obj);							}}
4 获取对象中的方法
package com.qianfeng.reflect;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class ReflectDemo4 {	/**	 * @param args	 * @throws ClassNotFoundException 	 * @throws SecurityException 	 * @throws NoSuchMethodException 	 * @throws InvocationTargetException 	 * @throws IllegalArgumentException 	 * @throws IllegalAccessException 	 * @throws InstantiationException 	 */	public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {		//动态获取类并创建对象后。訪问成员方法			//	accessMethod();		accessMethod1();		accessMethod2();	}			private static void accessMethod2() throws NoSuchMethodException, SecurityException, ClassNotFoundException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {	 	//动态获取类    	String str="com.qianfeng.domain.Person";    	Class claz = Class.forName(str);    	    	Method m = claz.getMethod("meth", null);    	    	m.invoke(null,null);			}	//得到带參数的方法并运行    private static void accessMethod1() throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {    	//动态获取类    	String str="com.qianfeng.domain.Person";    	Class claz = Class.forName(str);    	    	Method  m = claz.getMethod("func", String.class);    	    	Object obj = claz.newInstance();    	    	m.invoke(obj, "haha");    				}	//得到不带參数的方法并运行	private static void accessMethod() throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {		//动态获取类		String str="com.qianfeng.domain.Person";		Class claz = Class.forName(str);				Method m = claz.getMethod("show",null);				//创建对象		Object obj = claz.newInstance();				m.invoke(obj,null);									}}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

你可能感兴趣的文章
VScode格式化vue文件
查看>>
Java - 集合框架
查看>>
C6000系列之C6455 DSP的EMIFA接口
查看>>
POJ 1050 To the Max
查看>>
浅析微信支付:(余额提现)企业付款到微信用户零钱或银行卡账户
查看>>
2-9
查看>>
SpringMVC (四)MultiActionController
查看>>
unity_粒子系统
查看>>
初识linux内核漏洞利用
查看>>
HDU - 6393 Traffic Network in Numazu(树链剖分+基环树)
查看>>
HDU 3826 Squarefree number
查看>>
python数据分析实战---基础准备
查看>>
elasticsearch内存优化设置
查看>>
从键盘上连续录入一批整数,比较并输出其中的最大值和最小值,当输入数字0时结束循环...
查看>>
mysql不同端口的连接
查看>>
递归 正则表达式 杨辉三角
查看>>
转载 - sql分页优化
查看>>
比较好的Dapper封装的仓储实现类 来源:https://www.cnblogs.com/liuchang/articles/4220671.html...
查看>>
2018焦作区域赛E. Resistors in Parallel
查看>>
WebService之Axis2(2):复合类型数据的传递
查看>>