java 反射(Reflection)

2 篇文章 0 订阅
2 篇文章 0 订阅

JAVA反射机制
    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

 直接贴代码加注释吧!

package demo.reflect.a;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class ReflectionDemoMain {

	public static void main(String[] args) throws InstantiationException, IllegalAccessException
	{
		try {
			//根据类全称获取类
			Class demoClass = Class.forName("demo.reflect.b.ReflectionDemo");
			
			//获取类的一个实例对象。
			Object obj = demoClass.newInstance();
			
			/*Field 可以查看API看看都有什么方法。*/
			//遍历成员变量--这里看看能访问私有变量么?
			Field [] fieldArray = demoClass.getDeclaredFields();
			for(int i=0; i < fieldArray.length; i++)
			{
				//打印变量的类型
				System.out.println(fieldArray[i].getType());
				
				//打印变量的名称
				System.out.println(fieldArray[i].getName());				
				
				//打印变量的值,如果是私有变量这会抛出错误的
				
				/**
    Exception in thread "main" java.lang.IllegalAccessException: Class demo.reflect.a.ReflectionDemoMain can not access a member of class demo.reflect.b.ReflectionDemo with modifiers "private"
	at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)
	at java.lang.reflect.Field.doSecurityCheck(Field.java:954)
	at java.lang.reflect.Field.getFieldAccessor(Field.java:895)
	at java.lang.reflect.Field.get(Field.java:357)
	at demo.reflect.a.ReflectionDemoMain.main(ReflectionDemoMain.java:26)
				 */
//				System.out.println(fieldArray[i].get(obj));
							
//				它是利用的Field对象本身操作获取对应对象里变量的值,如果获取的其他类的实例里相同变量会有问题么?
//				也是会抛出异常的,可能有类的全称做标示吧。
				/**	
Exception in thread "main" java.lang.IllegalArgumentException
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:37)
at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:18)
at java.lang.reflect.Field.get(Field.java:357)
at demo.reflect.a.ReflectionDemoMain.main(ReflectionDemoMain.java:40)
*/
//				CopyOfReflectionDemoMain obj2 = new CopyOfReflectionDemoMain();
//				System.out.println(fieldArray[i].get(obj2));
			}
				
				/*
				 * 遍历函数名称
				 * 其他也详见API中Method
				 */
				
				Method [] methods = demoClass.getMethods();
				
				for(int i=0; i < methods.length; i++)
				{
					System.out.println("Method Name :[" +i+"]"+methods[i].getName());
				}
				
				/*
				 * 调用函数
				 * private函数就别试了,肯定跟私有变量一个下场,就不试了。
				 * 如果参数包含多个就用Class数组一个个设置上传进去就可以
				 */
				
				//参数类型设置
				Class [] paraTypes = {String.class};
				try {
					//获取方法
					Method method = demoClass.getMethod("UpString", paraTypes);
					String [] arg = {"test"};	
				
					//调用方法
					String result = (String)method.invoke(obj, arg);
					System.out.println("Result " + result);
				} catch (SecurityException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (NoSuchMethodException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IllegalArgumentException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (InvocationTargetException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			
			
			
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 

 

package demo.reflect.b;
/**
 * 试试反射的常用功能
 * @author zmy
 *
 */
public class ReflectionDemo {

	//public 成员变量
	public String member1 = "public value1";
	
	//private成员变量
	private static String member2 = "parivet value2";
	
	public ReflectionDemo()
	{
		member1 = "construction value1";
	}

	
	/**
	 * private函数,想试试利用反射能否调用其他私有函数
	 */
	private void printMember2()
	{
		System.out.println(member1);
	}
	
	/**
	 * 试试参数传递怎么用
	 * @param p
	 * @return
	 */
	public String UpString(String p)
	{
		return p.toUpperCase();
	}
}



 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值