今天进行java练习,遇到了需要用java反射来解决的问题——根据用户输入的string来生成一个相应类型对象做为WEBOBJECTS里wo元素的参数。使用了两个基本函数,备份一下。
根据classname新建实例
public Object newInstance(String className, Object[] args) throws Exception {
Class newoneClass = Class.forName(className);
Class[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}
Constructor cons = newoneClass.getConstructor(argsClass);
return cons.newInstance(args);
}
这里说的方法是执行带参数的构造函数来新建实例的方法。如果不需要参数,可以直接使用newoneClass.newInstance()来实现。
Class newoneClass = Class.forName(className):第一步,得到要构造的实例的Class。
第5~第9行:得到参数的Class数组。
Constructor cons = newoneClass.getConstructor(argsClass):得到构造子。
cons.newInstance(args):新建实例
调用实例方法
public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {
Class ownerClass = owner.getClass();
Class[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}
Method method = ownerClass.getMethod(methodName, argsClass);
return method.invoke(owner, args);
}
Class owner_class = owner.getClass() :首先还是必须得到这个对象的Class。
5~9行:配置参数的Class数组,作为寻找Method的条件。
Method method = ownerClass.getMethod(methodName, argsClass):通过Method名和参数的Class数组得到要执行的Method。
method.invoke(owner, args):执行该Method,invoke方法的参数是执行这个方法的对象,和参数数组。返回值是Object,也既是该方法的返回值。
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
/**
* Created by IntelliJ IDEA.
* File: TestRef.java
* User: leizhimin
* Date: 2008-1-28 14:48:44
*/
public class TestRef {
public static void main(String args[]) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
Foo foo = new Foo("这个一个Foo对象!");
Class clazz = foo.getClass();
Method m1 = clazz.getDeclaredMethod("outInfo");
Method m2 = clazz.getDeclaredMethod("setMsg", String.class);
Method m3 = clazz.getDeclaredMethod("getMsg");
m1.invoke(foo);
m2.invoke(foo, "重新设置msg信息!");
String msg = (String) m3.invoke(foo);
System.out.println(msg);
}
}
class Foo {
private String msg;
public Foo(String msg) {
this.msg = msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getMsg() {
return msg;
}
public void outInfo() {
System.out.println("这是测试Java反射的测试类");
}
}
引自
http://java.ccidnet.com/art/3539/20070924/1222147_1.html
分享到:
相关推荐
Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性使得Java具有了高度的灵活性,常用于框架开发、插件系统、元编程等...
在深入讨论如何操作父类之前,我们先简要回顾一下Java反射的基本概念: - **Class**: 每个类都有一个与之对应的`Class`对象,它是反射的基础。 - **Constructor**: 用于创建类的新实例。 - **Field**: 表示类的成员...
在这个主题中,我们将深入探讨如何使用Java反射来调用不同类型的参数方法,包括无参方法、Object类型参数的方法、基本类型参数的方法以及数组参数的方法,以及如何调用私有方法。 首先,要调用无参方法,我们可以...
具备反射机制的系统通常具备开放性和原因连接两个基本要素,其中开放性意味着系统对外部变化更为友好;原因连接则指的是对系统自描述的改变能够立即反映到系统底层的实际状态和行为上。 #### 二、Java反射机制概述 ...
了解了Java反射和动态代理的基本概念后,实践中我们需要谨慎使用,因为它们会带来一定的性能开销,并可能破坏封装性。然而,只要合理运用,它们能极大地提高代码的灵活性和可扩展性,是Java开发中的利器。 在提供的...
通过上述代码示例,我们可以看到Java反射机制的基本使用方法。它提供了一种动态调用类的方法和属性的能力,这对于编写灵活的代码非常有用。然而,由于反射涉及到类的内部结构,因此在使用时需要谨慎,确保不会因为...
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。通过反射,我们可以动态地创建对象、访问和修改字段、调用方法,甚至执行私有方法和访问包内可见的元素。...
Java反射是Java编程语言中的一个强大特性,它允许运行时检查类、接口、字段和方法的信息,甚至可以动态地创建对象并调用其方法。在Java中,`java.lang.reflect`包提供了对反射的支持,包括`Class`、`Constructor`、`...
具备反射机制的系统通常满足两个条件:开放性和因果连接性。 - **开放性**:反射系统能够适应未知的变化,允许外部实体动态地加入系统而不破坏现有结构。 - **因果连接性**:系统自描述的改变能够立即体现在系统...
假设我们有一个`Calculator`类,其中包含`add`和`subtract`两个方法。在不直接引用`Calculator`类或其方法的情况下,我们可以使用以下步骤动态调用这些方法: - 获取`Calculator`类的`Class`对象:`Class<?> ...
在"Java反射机制学习(二)"这篇博文中,作者可能详细解释了以上这些概念,并通过`BaseTest.java`和`Student.java`这两个示例文件进行了实例演示。`BaseTest.java`可能包含了一组基础的反射操作,而`Student.java`...
总的来说,“JAVA反射参数传递概略”这个主题涵盖了如何使用反射来调用方法,特别是处理参数传递的细节。通过熟练掌握反射,开发者能够实现更灵活的代码,比如动态代理、插件系统或者元编程,但同时也需要注意反射...
Java反射和工厂模式是两种非常重要的编程概念,它们在软件设计和实现中起着关键作用。反射机制允许我们在运行时动态地获取类的信息并操作对象,而工厂模式是一种设计模式,它提供了一种创建对象的最佳方式,使得代码...
这个“JDBC_Java反射技术入门”资源将帮助初学者理解这两个重要概念,并提供实践操作,为后续的Java开发工作打下坚实基础。通过学习这些基础知识,开发者能够更好地掌握数据库操作,以及在运行时动态操控Java对象,...
在"JAVA反射与代理"这个主题中,我们将深入探讨这两个核心概念。 首先,让我们了解反射的基本用法。当一个类的名称在运行时才被知道,反射可以帮助我们动态地创建对象。例如,我们可以使用`Class.forName()`方法...
在上述代码示例中,我们创建了一个`Vehicle`接口,它定义了`Start()`和`Stop()`两个方法。然后我们有两个类`Car`和`Train`实现了这个接口,分别提供了各自的方法实现。在`ReflectMain`主类中,我们展示了如何利用...
Java反射API允许程序在运行时检查类、接口、字段和方法的信息,并能够动态地创建对象和调用方法。这一能力使得Java具有了很高的灵活性,尤其是在处理未知类型的对象或在不修改源码的情况下扩展功能时。 1. **Class...
假设我们有两个 `Person` 类的实例 `person1` 和 `person2`,我们想要将 `person1` 的属性值复制到 `person2`: ```java public static void copyBeanProperties(Object source, Object target) throws ...
Java反射机制是Java语言的一个强大特性,允许程序在运行时检查类、接口、字段和方法的信息,并能动态地创建对象和调用方法。通过java.lang.Class和java.lang.reflect包中的类,我们可以获取类的结构信息,包括构造器...