Class.forName("类名"),例如,Class.forName("java.util.Date");
下面是实例用到的一个类:
public class Person { private int id; private String name; public Person(int i,String n) { id=i; name=n; } @Override public String toString() { return name+"="+id; } }
import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; public class ReflectDemo { public static void main(String[] args) throws Exception { test4(); test3(); ReflectDemo.test2(); ReflectDemo.test1(); } //在String泛型修饰的集合内放入Integer对象 public static void test4() throws Exception { List<String> list=new ArrayList<String>(); list.add("strlist"); System.out.println("==============="+list.size()); Class<Object> cla=(Class<Object>) Class.forName("java.util.List"); Method met=cla.getMethod("add", Object.class); met.invoke(list, new Integer(1)); System.out.println("==============="+list.size()); for (int i=0;i<list.size();i++) { System.out.println(String.valueOf(list.get(i))); } System.out.println("==============="+list.size()); } //把对象的属性值改变 public static void test3() throws Exception { Person per=new Person(112,"aAAGGGasdJHdzdanacca"); System.out.println(per); //获取类的字节码对象 Class cla=Class.forName("ljt.reflect.Person"); //获取此对象的所有字段 Field[] fileds=cla.getDeclaredFields(); for (Field field : fileds) { field.setAccessible(true); //如果此字段是String类型的话 if(field.getType()==String.class) { //获取此字段的内容 String oldField=(String)field.get(per); //将字段中的小写字母全部转换为大写字母 char[] oldChar=oldField.toCharArray(); for (int i=0;i<oldChar.length;i++) { if(oldChar[i]>96) { oldChar[i]=(char)(oldChar[i]-32); } } String newField=new String(oldChar); //将对象的相应字段值改变 field.set(per, newField); } } System.out.println(per); } //反射的三种方式 public static void test1() throws ClassNotFoundException { /* * 得到各个字节码对应的实例对象( Class类型) 三种方式: 1. 类名.class,例如,System.class 2. 对象.getClass(),例如,new Date().getClass() 3. Class.forName("类名"),例如,Class.forName("java.util.Date");*/ //类名.class,例如,System.class Class<String> c1=String.class; //对象.getClass(),例如,new Date().getClass() Class<String> c2=(Class<String>)new String().getClass(); //Class.forName("类名"),例如,Class.forName("java.util.Date") Class<String> c3=(Class<String>)Class.forName("java.lang.String"); System.out.println((c1==c2)+"--"+(c1==c3)); } //利用反射获取构造器 public static void test2() throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { /* * Class 类的实例表示正在运行的 Java 应用程序中的类和接口。 * 方法: * Constructor<T> getConstructor(Class<?>... parameterTypes) 返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。 Constructor<?>[] getConstructors() 返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。 java.lang.reflect 类 Constructor<T> Constructor 提供关于类的单个构造方法的信息以及对它的访问权限。 方法: T newInstance(Object... initargs) 使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。 * */ Class<String> c1=String.class; //获取参数列表为一个String类型的对象的构造方法 Constructor<String> const1=c1.getConstructor(String.class); //通过Constructor的newInstance方法获取String的对象 String str=const1.newInstance("ijava"); System.out.println(str); //无参构造可以直接使用字节码对象创建该类的实例 String str2=c1.newInstance(); str2="ljt"; System.out.println(str2); } }
原文:http://blog.csdn.net/sinat_26342009/article/details/45335591