`
雪馨25
  • 浏览: 128526 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

【java】反射可执行的实例

阅读更多

一、实例目标

根据传入的完整类名字符串类名,实现创建对应类的实例

根据传入的类实例,以及传入的方法名字符串,实现动态调用指定的方法,返回方法的返回值

FanSheTest 单元测试中实现使用FanShe类传入"cn.com.rwq.test.Entity"字符串实现创建Entity类,并且根据传入的字符串动态调用类中的与字符串同名的方法

二、代码

1、测试类

package cn.com.rwq.test;

import junit.framework.TestCase;

public class FanSheTest  extends TestCase {
	private FanShe fanShe ;

	@Override
	protected void setUp() throws Exception {
		super.setUp();
		fanShe = new FanShe() ;
	}

	@Override
	protected void tearDown() throws Exception {
		super.tearDown();
		
	}
	
	public void testCreateClass() throws Exception{
		Object object = fanShe.createClass("cn.com.rwq.test.Entity");
		assertNotNull(object);
		Common common = (Common)object;
		assertEquals("123456789", common.getName());
		assertEquals("12345678", ((Entity)object).toString());
		
	}
	
	public void testCreateObject() throws Exception{
		Object object = fanShe.createClass("cn.com.rwq.test.Entity");
		fanShe.createObject(object, "print");
		
//		fanShe.createObject(object, "two");
//		strPrint
//		fanShe.createObject(object, "siyou");
		
		String a =(String)fanShe.createObject(object, "strPrint");
		assertEquals("abs", a);
		
		int b =(int)fanShe.createObject(object, "intPrint");
		assertEquals(123, b);
		Common common = (Common)object;
		fanShe.createObject(common, "printName");
	}
}

2、反射了的实现

package cn.com.rwq.test;

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

public class FanShe {
	/**
	 * 根据完整类名创建对应类的实体
	 * @param className 完整类名
	 * @return 创建的实体
	 */
	public Object createClass(String className)
		 throws ClassNotFoundException, InstantiationException, IllegalAccessException {  
			    Class clazz = Class.forName(className);  
			    Method m[] = clazz.getDeclaredMethods();
			    for(Method one : m){
			    	System.out.println(one.toString());
			    }
			    Object object= clazz.newInstance(); 
			    return object;
	}
	/**
	 * 根据类,以及方法名,动态调用方法
	 * @param object 类
	 * @param actionName 方法名
	 * @return 调用的方法的返回值
	 */
	public static Object createObject(Object object,String actionName)  
		    throws ClassNotFoundException, InstantiationException, IllegalAccessException {  
		  	 Method aMethod;
			try {
				aMethod = object.getClass().getMethod(actionName,null);
				 return aMethod.invoke(object,null);
			} catch (NoSuchMethodException | SecurityException e1) {
				e1.printStackTrace();
			} catch (IllegalArgumentException | InvocationTargetException e) {
					e.printStackTrace();
				}
		    return null;  
	} 
}

3、javaBean

package cn.com.rwq.test;
/**
 * javaBean
 * @author Administrator
 */
public class Entity extends Common {

	public Entity(){
		System.out.println("Entity 构造方法");
	}
	public void print(){
		System.out.println("执行printe 无返回值");
	}
	void two(){
		System.out.println("执行two 方法");
	}
	private void  siyou(){
		System.out.println("执行siyou 私有方法");
	}
	public String strPrint(){
		System.out.println("执行strPrint 有返回值");
		return "abs";
	}
	public int intPrint(){
		System.out.println("执行intPrint 有返回值");
		return 123;
	}
	public void printName(){
		System.out.println("11111111    "+super.getName());
	}
	public String toString(){
		return "12345678";
	}
	public static void main(String[] args){
		Entity fanshe = new Entity();
		fanshe.print();
		fanshe.two();
		fanshe.siyou();
		System.out.println(fanshe.strPrint());
	}
}

 

4、父类

 

package cn.com.rwq.test;
/**
 * 父类
 */
public class Common {
	private String name = "123456789";

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

三、重点理解
1.待实现的实体类必须有无参的构造函数
2. Class<?> demo= Class.forName(""); 根据完整类名的字符串得到指定的类
3.取得一个类的全部框架


        Class<?> demo = Class.forName("cn.com.rwq.test.Entity");
        System.out.println("===============本类属性========================");
        // 取得本类的全部属性
        Field[] field = demo.getDeclaredFields();
        for (int i = 0; i < field.length; i++) {
            // 权限修饰符
            int mo = field[i].getModifiers();
            String priv = Modifier.toString(mo);
            // 属性类型
            Class<?> type = field[i].getType();
            System.out.println(priv + " " + type.getName() + " "
                    + field[i].getName() + ";");
        }
        System.out.println("=========实现的接口或者父类的属性==============");
        // 取得实现的接口或者父类的属性
        Field[] filed1 = demo.getFields();
        for (int j = 0; j < filed1.length; j++) {
            // 权限修饰符
            int mo = filed1[j].getModifiers();
            String priv = Modifier.toString(mo);
            // 属性类型
            Class<?> type = filed1[j].getType();
            System.out.println(priv + " " + type.getName() + " "
                    + filed1[j].getName() + ";");
        }
    }
}

4. //调用无参方法(Class<?> demo 实例化的类)

Method method=demo.getMethod( "方法名" );
method.invoke(demo.newInstance());
//调用有参数的方法
method=demo.getMethod( "方法名 " , String. class , int . class );
method.invoke(demo.newInstance(), "Rollen" , 20 );

 

 

分享到:
评论

相关推荐

    Java反射动态加载实例类

    ### Java反射机制与动态加载实例类 在Java中,反射是一种强大的工具,允许程序在运行时检查和修改其结构和行为。通过反射,我们可以动态地加载类、创建对象、访问和修改字段、调用方法等。本文将深入探讨Java反射...

    反射实例-JAVA反射机制

    ### 反射实例—JAVA反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...

    java反射调用实例代码

    这个资源“java反射调用实例代码”提供了关于如何使用Java反射API进行各种操作的实际示例。 在Java中,`java.lang.reflect`包提供了对反射的支持,包括`Class`类,`Constructor`类,`Method`类和`Field`类。这些类...

    Java反射实例源码

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

    java反射实例

    在标题“Java反射实例”中,我们聚焦于如何在实际编程中应用这一特性。通过反射,我们可以动态地获取类的信息,如类名、方法名、字段名,甚至可以在运行时创建和调用对象。这对于实现元编程、插件系统、序列化、单元...

    Java反射机制的详细讲解及实例,有助于java深度开发

    三、Java反射实例 1. 创建对象:通过`Class.newInstance()`创建默认构造器的对象,或`Constructor.newInstance()`创建指定构造器的对象。 ```java Class&lt;?&gt; clazz = Class.forName("com.example.MyClass"); MyClass ...

    Java反射机制总结(实例分析)

    总之,Java反射机制为开发者提供了强大的灵活性,允许程序在运行时检查和修改自身的行为,是Java生态系统中不可或缺的一部分。然而,使用时应当权衡其带来的便利与潜在的问题,合理地在项目中应用。

    Java反射机制总结

    - **运行时装配**:Java反射允许程序在运行时动态地加载类和创建对象,这对于构建可扩展的应用程序非常有用。 - **元数据查询**:开发人员可以利用反射来查询类的元数据,如字段名、方法签名等。 - **动态调用方法**...

    JAVA3D官方实例

    描述中的“可直接导入到Eclipse里运行”意味着这些实例是完整的Java项目,包含了所有必要的源代码、配置文件以及依赖库。Eclipse作为流行的Java IDE,支持直接导入外部项目,这使得学习过程更为便捷。初学者只需按照...

    Java方法反射调用demo

    Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性使得Java具有了高度的灵活性,常用于框架开发、插件系统、元编程等...

    java反射.pdf

    ### Java反射机制详解 #### 一、什么是Java反射? Java反射是Java编程语言的一个特性,它允许运行时检查和操作程序结构(类、字段、方法等)。反射的主要用途包括但不限于:动态实例化对象、访问私有成员、调用...

    JAVA 反射机制应用

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

    Java IOC及反射api代码参考实例

    Spring框架通过反射来实例化bean,并根据配置的依赖关系进行注入。例如,当定义了一个带有@Autowired注解的字段时,Spring会利用反射找到合适的依赖并注入到该字段中。 下面是一些关于Java IOC和反射API的关键知识...

    北大青鸟java反射机制

    总之,Java反射机制是Java程序员必备的技能之一,它提供了对程序运行时类型信息的访问和操作,极大地扩展了Java代码的灵活性和可扩展性。通过深入学习和实践,我们可以更好地理解和利用这一强大的工具。

    java反射原理详解

    Java反射机制是Java语言的一种强大的特性,它允许程序在运行时动态地获取类的信息并操作类的对象。在Java中,反射主要涉及到`java.lang.Class`类、`java.lang.reflect`包中的类(如Constructor、Method、Field)以及...

    Java 反射-动态代理

    Java反射和动态代理是Java编程中的重要特性,它们在实现高度灵活和动态的代码执行上发挥着关键作用。本文将深入探讨这两个概念,以及如何在实际开发中利用它们。 首先,我们来理解Java反射(Reflection)。Java反射...

    java反射的demo代码

    Java反射是Java编程...总之,Java反射提供了一种在运行时动态操控类、接口、字段和方法的能力,是Java平台灵活性和可扩展性的关键组成部分。通过`ReflectTest`这样的示例,我们可以更好地理解和应用这个强大的工具。

    Java反射机制经典案例

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查并操作类、接口、字段和方法等对象。这种能力使得Java代码能够具备动态性,可以在不知道具体类名的情况下实例化对象,调用方法,访问字段,以及...

    java反射.ppt

    总之,Java反射提供了一种强大的机制,使程序员能够在运行时探索和操纵类、对象、方法和字段,极大地增强了Java的灵活性和可扩展性。然而,使用反射也需要注意性能损失和安全性问题,因此在实际开发中需谨慎使用。

Global site tag (gtag.js) - Google Analytics