首先,通过字符串创建对象,也就是说同一个包下有好多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();
}