`
java--hhf
  • 浏览: 308494 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

java反射实例——java.lang.reflect

阅读更多

    本文主要解释一下几个问题

1、如何根据对象获得类的所有方法和属性

2、如何根据类名获得类的方法和属性

3、如何选择被反射类的构造函数 并 调用该函数获得实例

4、如何批量执行无参函数

5、如何调用指定名字的方法

6、如何调用有参的函数

7、如何反射调用类的私有方法

————————————————————————————————————

package com.hhf.reflect;

/**
 * 等待被反射的类
 * 用于解释如何通过反射获得类的方法与属性 
 * 如何选择被反射类的构造函数
 * 如何批量执行类的函数
 * @author HHF
 * 2014年4月17日
 */

public class DataFunc {
  private int data1;
  private int data2;
  private int result;

  public DataFunc() {
    data1=0;
    data2=0;
    result=0;
  }
  public DataFunc(int x,int y){
    data1=x;
    data2=y;
   
  }

  public int add(){
    result=data1+data2+1;
    return result;
  }
  
  public int substract(){
    result=data1-data2;
    return result;
  }

  public int multiply(){
    result=data1*data2;
    return result;
  }
  
  public int divide(){
	  result=data1/data2;
	  return result;
	  
  }
  

}

 

package com.hhf.reflect;

/**
 * 等待被反射的类
 * 主要为了解释一个有参的方法如何反射调用
 * @author HHF
 * 2014年4月17日 
 */
public class DataFunc2 {
	@SuppressWarnings("unused")
	private int data1;
	@SuppressWarnings("unused")
	private int data2;
	private int result;

	public DataFunc2() {
		data1 = 0;
		data2 = 0;
		result = 0;
	}

	public DataFunc2(int x, int y) {
		data1 = x;
		data2 = y;

	}

	public int add2(int a, int b, int c) {
		result = a + b + c;
		return result;
	}
}

 

package com.hhf.reflect;

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

public class Refect {

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

	// 使用反射机制的步骤:
	// 导入java.lang.relfect 包
	// 遵循三个步骤
	// 第一步是获得你想操作的类的 java.lang.Class 对象
	// 第二步是调用诸如 getDeclaredMethods 的方法
	// 第三步使用 反射API 来操作这些信息
	public static void main(String [] args){
		Refect refect = new Refect();
		System.out.println("-----------------------通过对象获得方法和属性------------------------");
		refect.reflectInstance();
		System.out.println("-----------------------通过类名获得方法与参数----------------------------");
		refect.reflectClass();
		System.out.println("-----------------------批量执行方法------------------------------");
		refect.RunMethod();
		System.out.println("-----------------------调用指定无参方法----------------------------");
		refect.RunSepcMethod();
		System.out.println("-----------------------调用有参数方法------------------------------");
		refect.RunParmMethod();
	}
	/**
	 * 通过对象获得类的	方法和属性
	 */
	public void reflectInstance() {
		try {			
			DataFunc a = new DataFunc();
			Class cla = Class.forName(a.getClass().getName());// 根据类的全路径进行类加载,返回该类的Class对象
			Method[] method = cla.getDeclaredMethods();// 利用得到的Class对象的自审,返回方法对象集合
			System.out.println("********该类的所有方法********");
			for (Method me : method) {// 遍历该类方法的集合
				System.out.println(me.toString());// 打印方法信息
			}
			System.out.println("********该类的所有属性********");
			Field[] field = cla.getDeclaredFields();// 利用得到的Class对象的自审,返回属性对象集合
			for (Field me : field) { // 遍历该类属性的集合
				System.out.println(me.toString());// 打印属性信息
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	/**
	 * 通过类的完整路径获得类的	方法和属性
	 */
	public void reflectClass() {

		try {			
			Class cla = Class.forName("com.hhf.reflect.DataFunc");// 根据类的全路径进行类加载,返回该类的Class对象
			Method[] method = cla.getDeclaredMethods();// 利用得到的Class对象的自审,返回方法对象集合
			System.out.println("********该类的所有方法********");
			for (Method me : method) {// 遍历该类方法的集合
				System.out.println(me.toString());// 打印方法信息
			}
			System.out.println("********该类的所有属性********");
			Field[] field = cla.getDeclaredFields();// 利用得到的Class对象的自审,返回属性对象集合
			for (Field me : field) { // 遍历该类属性的集合
				System.out.println(me.toString());// 打印属性信息
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 指定构造函数
	 * 可以另外的通过构造函数给函数属性传递参数 并调用方法
	 */
	public void RunMethod() {
		try {
			// 获得指定字符串类对象
			Class cla = Class.forName("com.hhf.reflect.DataFunc");
			// 设置Class对象数组,用于指定构造方法类型
			Class[] cl = new Class[] { int.class, int.class };
			// 获得Constructor构造器对象。并指定构造方法类型
			Constructor con = cla.getConstructor(cl);
			// 给传入参数赋初值
			Object[] x = { new Integer(33), new Integer(67) };
			// 得到实例
			Object obj = con.newInstance(x);

			Method[] method = cla.getDeclaredMethods();// 利用得到的Class对象的自审,返回方法对象集合
			//批量调用方法(无参数的方法)
			for (Method me : method) {// 遍历该类方法的集合
				System.out.print("调用方法:"+me.toString());// 打印方法信息
				String str = me.invoke(obj).toString();
				System.out.println("\t该方法执行结果"+str);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	/**
	 * 指定方法名的调用方法
	 */
	public void RunSepcMethod() {
		try {
			// 获得指定字符串类对象
			Class cla = Class.forName("com.hhf.reflect.DataFunc");
			// 设置Class对象数组,用于指定构造方法类型
			Class[] cl = new Class[] { int.class, int.class };
			// 获得Constructor构造器对象。并指定构造方法类型
			Constructor con = cla.getConstructor(cl);
			// 给传入参数赋初值
			Object[] x = { new Integer(33), new Integer(67) };
			// 得到实例
			Object obj = con.newInstance(x);
			
			Method specMethod = cla.getMethod("add");
			String str = specMethod.invoke(obj).toString();
			System.out.println("调用方法"+specMethod.getName()+"的结果\t"+str);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 调用有参数的方法
	 */
	public void RunParmMethod() {
		try {
			// 获得指定字符串类对象
			Class cla = Class.forName("com.hhf.reflect.DataFunc2");
			// 设置Class对象数组,用于指定构造方法类型
			Class[] cl = new Class[] { int.class, int.class };
			// 获得Constructor构造器对象。并指定构造方法类型
			Constructor con = cla.getConstructor(cl);
			// 给传入参数赋初值
			Object[] x = { new Integer(33), new Integer(67) };
			// 得到实例
			Object obj = con.newInstance(x);	

//			Method specMethod1 = cla.getMethod("a", int.class, int.class);
			Class[] c2 = new Class[] { int.class, int.class, int.class};
			Method parmMethod = cla.getMethod("add2", c2);
			// 给传入参数赋初值
			Object[] x2 = { new Integer(3), new Integer(6), new Integer(1)};
			// 得到实例
			String str = parmMethod.invoke(obj, x2).toString();
			System.out.println("调用方法"+parmMethod.getName()+"的结果\t"+str);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

 

//等待被反射的类 其中只有一个私有方法
public class PrivateMethod {
	//私有方法
	private int add(int a, int b){		
		return a +b+1 ;
	}
}

 

//反射调用私有方法
//获取目标类的class对象
Class<PrivateMethod> class1 = PrivateMethod.class;
//获取目标类的实例
Object instance = class1.newInstance();		
//getDeclaredMethod()  可获取 公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
Method method = class1.getDeclaredMethod("add", new Class[]{int.class,int.class});		
//值为true时 反射的对象在使用时 应让一切已有的访问权限取消
method.setAccessible(true);	
Object result = method.invoke(instance, new Object[]{1,2});

 

 

分享到:
评论

相关推荐

    实例_ Java中的代理模式(csdn)————程序.pdf

    动态代理使用`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来创建代理对象。 在动态代理中,我们不再需要为每个被代理类创建单独的代理类。`ProxyHandle`实现了`InvocationHandler`接口...

    java学习——java中的反射学习笔记.rar_java 反射

    在Java中,反射是通过java.lang.Class类和java.lang.reflect包中的类来实现的。本篇笔记将深入探讨Java反射的概念、重要性以及如何使用。 一、反射基础 1. 类加载:当Java虚拟机(JVM)加载一个类时,它会创建该类...

    Java反射实例源码

    标题"Java反射实例源码"表明我们将探讨如何通过源代码来实现和理解Java反射。这个实例可能包含了如何动态地创建对象、调用方法、访问字段和执行构造器的示例。 描述中提到的博客文章"菜鸟学编程(九)——Java反射...

    Java深度历险(七)——Java反射与动态代理.pdf

    在"Java深度历险(七)——Java反射与动态代理"中,我们探讨了如何利用反射API获取类的运行时信息以及如何动态地执行类的操作。 首先,反射API的核心是`java.lang.Class`类,它代表了Java程序中的每一个类型。通过`...

    java反射机制 字符串——java对象

    Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是`java.lang.Class`,它代表了运行时的类信息。通过Class对象,我们...

    JAVA 私塾笔记整理——反射机制(Reflection)

    - 动态代理:Java的`java.lang.reflect.Proxy`类可以利用反射创建动态代理对象。 - 测试工具:JUnit等测试框架利用反射来调用私有方法进行测试。 - 数据库操作:ORM框架如Hibernate通过反射将数据库记录映射为...

    JAVA反射机制-Class类-Class对象的获取.pdf

    ### JAVA反射机制——Class类与Class对象的获取 #### 概述 在Java语言中,反射是一种强大的功能,允许程序在运行时动态地检查和修改自身的行为。这种能力是通过`java.lang.Class`类实现的,它提供了封装类或接口...

    java中的反射机制

    3. **`java.lang.reflect.Constructor`** —— 表示类中的构造器,可以用来创建类的新实例。 4. **`java.lang.Class`** —— 表示类本身,是所有反射操作的基础。 #### 四、获取Class对象的方法 要使用反射,首先...

    JAVA 简单实例

    在本资源中,"JAVA 简单实例" 提供了两个项目——Java01 和 Java02,它们是学习 Java 编程语言的理想实践案例。这些项目包含了多个类和方法的实现,可以帮助初学者更好地理解和掌握 Java 的核心概念。 1. **Java 类...

    Java动态调用实例

    `java.lang.reflect`包提供了多种类和接口来支持反射,如`Class`、`Constructor`、`Method`和`Field`。例如,你可以通过`Class.forName()`获取类的`Class`对象,然后使用`getMethods()`获取所有公共方法,或者`...

    Java反射大全

    Java反射大全是对Java编程语言中一项重要特性——反射的深入探讨。反射机制使得Java程序在运行时能够获取关于自身的信息,如类、接口、字段和方法等,并能在运行时动态地创建对象、调用方法、修改属性。这使得Java...

    java-6个机制.doc

    import java.lang.reflect.Constructor; import java.lang.reflect.Method; public class ReflectionExample { public static void main(String[] args) throws Exception { Class&lt;?&gt; clazz = Class.forName(...

    JDK5.0新特性 反射、枚举.rar

    在`JDK5.0新特性 (2)——反射.doc`中,你可能会学习到如何使用`java.lang.Class`对象来获取类信息,以及如何使用`java.lang.reflect`包中的`Constructor`、`Method`和`Field`类来操作类的构造器、方法和字段。反射的...

    java——让学员少走弯路

    Class类是所有Java类的超类,反射API(java.lang.reflect)允许程序在运行时检查和操作类、接口、字段和方法。Runtime类与单例设计模式结合,可以实现全局唯一的运行时实例。 位运算在Java中用于对二进制位进行操作...

    Java反射机制

    Java反射机制是Java编程语言中的一个核心特性,它允许程序在运行时动态地获取类的信息并操作类的对象。反射机制提供了对Java类和对象的底层访问,使得开发者能够在不知道对象具体类型的情况下创建和操作对象,增加了...

    解锁ReflectionUtils:让你的Java代码更灵活、更强大

    `ReflectionUtils`简化了Java反射操作的复杂性,提供了更加简洁和易用的API。这让开发者能够更快地上手使用。 **2. 增强代码可读性** 使用`ReflectionUtils`可以使代码更加简洁明了,提高代码的可读性和可维护性...

    Manning Java Reflection In Action

    ### Java反射技术详解——《Java Reflection in Action》 #### 一、引言 在现代软件开发领域,Java作为一门广泛使用的编程语言,其强大的特性和灵活性使得开发者能够构建出复杂而高效的应用程序。其中,Java反射...

    675.673.JAVA基础教程_动态代理与Java8新特性-方法引用的使用情况3(675).rar

    通常,我们通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现动态代理。InvocationHandler接口定义了一个`invoke`方法,该方法会在代理对象的每个方法调用时被触发,从而提供了...

    reflection_java_joyopf_

    反射还用于动态代理,比如JDK的`java.lang.reflect.Proxy`类和CGLIB库。它们允许我们在运行时创建一个新的类,该类将作为原始类的代理,可以在调用方法时插入自定义的行为。这对于实现事务管理、权限控制等跨切面...

    java--数组.txt

    为了动态创建一个数组,我们可以利用`java.lang.reflect.Array`类提供的方法。例如,如果想要创建一个包含10个`arraytest.MyClass`对象的数组,可以使用以下代码: ```java arraytest.MyClass[] arr = (arraytest....

Global site tag (gtag.js) - Google Analytics