通过字符串创建对象并访问类中的方法(利用java的反射)

首先,通过字符串创建对象,也就是说同一个包下有好多xxxclass.java文件,这些文件中都有相同的属性和方法,那么问题是如何通过我传入字符串来创建对应的对象并访问其中的方法属性等

先来简单说一下什么是反射?

----能够分析类能力的程序----


下面进入正题:创建对象

假如在src下demo  的pacage里有demo1class.java,          demo2class.java,           demo3class.java,              demo4class.java,四个文件,每个文件内容如下(都有proprty,id两个属性,getId()和getName()两个方法):

package demo;


public class demo2class {
private String proprety = null;
private int id = 1;
public void getId(){
System.out.println("getId():demo2class");
}
public void getName(){
System.out.println("getName():demo2class");
}


}


下面是main方法的实现:

package demo;


import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;


public class demo {
public static void main (String arg []) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException{
String className="demo2"+"class";
Class<?> clazz = Class.forName("demo."+className);
        

              // 调用demo2class类中的getId方法
       Method method = clazz.getMethod("getId");
       method.invoke(clazz.newInstance());
       // Java 反射机制 - 调用某个类的方法1.
      

                // 调用demo2class的getName方法
       method = clazz.getMethod("getName");
       method.invoke(clazz.newInstance());
       
       
       try {
Field f=clazz.getDeclaredField("id");
f.setAccessible(true);
//f.set(clazz.newInstance(), "java");
Object o= f.get(clazz.newInstance());
System.out.println(o.toString());

} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}




}


根据字符串创建对象,用java反射中的Class.forName(”包路径”);通过调用静态方法forName或得类名对应的Class对象。

例如:String className = “java.until.Date”;

            Class clazz= Class.forName(className);

1)调用类中方法用Method-----其中getMethods()方法获取类中所有方法,带参数的或得指定的方法。

clazz.newInstance()-----------快速的创建一个类的实例  (Class.forName(className).newInstance();和new差不多)

            / / 调用demo2class类中的getId方法
        Method method = clazz.getMethod("getId");
        method.invoke(clazz.newInstance());
        // Java 反射机制 - 调用某个类的方法1.

2)调用类中属性用Field---需要try 。。catch抛出异常,当属性是私有的时候需要f.setAccessible(true);

        try {
Field f=clazz.getDeclaredField("id");
f.setAccessible(true);
//f.set(clazz.newInstance(), "java");
Object o= f.get(clazz.newInstance());
System.out.println(o.toString());

} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值