一、实例目标
根据传入的完整类名字符串类名,实现创建对应类的实例
根据传入的类实例,以及传入的方法名字符串,实现动态调用指定的方法,返回方法的返回值
在
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.
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反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...
这个资源“java反射调用实例代码”提供了关于如何使用Java反射API进行各种操作的实际示例。 在Java中,`java.lang.reflect`包提供了对反射的支持,包括`Class`类,`Constructor`类,`Method`类和`Field`类。这些类...
标题"Java反射实例源码"表明我们将探讨如何通过源代码来实现和理解Java反射。这个实例可能包含了如何动态地创建对象、调用方法、访问字段和执行构造器的示例。 描述中提到的博客文章"菜鸟学编程(九)——Java反射...
在标题“Java反射实例”中,我们聚焦于如何在实际编程中应用这一特性。通过反射,我们可以动态地获取类的信息,如类名、方法名、字段名,甚至可以在运行时创建和调用对象。这对于实现元编程、插件系统、序列化、单元...
三、Java反射实例 1. 创建对象:通过`Class.newInstance()`创建默认构造器的对象,或`Constructor.newInstance()`创建指定构造器的对象。 ```java Class<?> clazz = Class.forName("com.example.MyClass"); MyClass ...
总之,Java反射机制为开发者提供了强大的灵活性,允许程序在运行时检查和修改自身的行为,是Java生态系统中不可或缺的一部分。然而,使用时应当权衡其带来的便利与潜在的问题,合理地在项目中应用。
- **运行时装配**:Java反射允许程序在运行时动态地加载类和创建对象,这对于构建可扩展的应用程序非常有用。 - **元数据查询**:开发人员可以利用反射来查询类的元数据,如字段名、方法签名等。 - **动态调用方法**...
描述中的“可直接导入到Eclipse里运行”意味着这些实例是完整的Java项目,包含了所有必要的源代码、配置文件以及依赖库。Eclipse作为流行的Java IDE,支持直接导入外部项目,这使得学习过程更为便捷。初学者只需按照...
Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性使得Java具有了高度的灵活性,常用于框架开发、插件系统、元编程等...
### Java反射机制详解 #### 一、什么是Java反射? Java反射是Java编程语言的一个特性,它允许运行时检查和操作程序结构(类、字段、方法等)。反射的主要用途包括但不限于:动态实例化对象、访问私有成员、调用...
Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是java.lang.Class,它代表了运行时的类信息。通过Class对象,我们...
Spring框架通过反射来实例化bean,并根据配置的依赖关系进行注入。例如,当定义了一个带有@Autowired注解的字段时,Spring会利用反射找到合适的依赖并注入到该字段中。 下面是一些关于Java IOC和反射API的关键知识...
总之,Java反射机制是Java程序员必备的技能之一,它提供了对程序运行时类型信息的访问和操作,极大地扩展了Java代码的灵活性和可扩展性。通过深入学习和实践,我们可以更好地理解和利用这一强大的工具。
Java反射机制是Java语言的一种强大的特性,它允许程序在运行时动态地获取类的信息并操作类的对象。在Java中,反射主要涉及到`java.lang.Class`类、`java.lang.reflect`包中的类(如Constructor、Method、Field)以及...
Java反射和动态代理是Java编程中的重要特性,它们在实现高度灵活和动态的代码执行上发挥着关键作用。本文将深入探讨这两个概念,以及如何在实际开发中利用它们。 首先,我们来理解Java反射(Reflection)。Java反射...
Java反射是Java编程...总之,Java反射提供了一种在运行时动态操控类、接口、字段和方法的能力,是Java平台灵活性和可扩展性的关键组成部分。通过`ReflectTest`这样的示例,我们可以更好地理解和应用这个强大的工具。
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查并操作类、接口、字段和方法等对象。这种能力使得Java代码能够具备动态性,可以在不知道具体类名的情况下实例化对象,调用方法,访问字段,以及...
总之,Java反射提供了一种强大的机制,使程序员能够在运行时探索和操纵类、对象、方法和字段,极大地增强了Java的灵活性和可扩展性。然而,使用反射也需要注意性能损失和安全性问题,因此在实际开发中需谨慎使用。