标签:class 面向对象 反射 reflect javase
Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class。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);
}
}
标签:class 面向对象 反射 reflect javase
原文地址:http://blog.csdn.net/sinat_26342009/article/details/45335591