1,反射(java运行过程中解剖一个类)
*在运行过程中能动态的得到类的所有信息,以及能动态的调用对象的成员的这样一种java机制称为反射
*Java中的每一种类型都有一个对应的字节码文件对象
*类是用来描述事物的,那么对于类是不是也可以用一个类来描述(可以把这个类称为类的描述类),这个类为Class
2,既然反射能得到类的信息,那么就从类的各个组成部分分析(构造函数,成员方法,成员变量),看java如何反射得到这些部分
*反射构造函数
import java.lang.reflect.Constructor;
/*
掌握:
构造方法的反射
*/
public class _6_ReflectTest2
{
public static void main(String[] args) throws Exception
{
String str=new String(new StringBuffer("abc"));
System.out.println(str);
Class cla=String.class;
Constructor cons=cla.getConstructor(StringBuffer.class);
String str2=(String)cons.newInstance(new StringBuffer("abc"));
System.out.println(str2);
}
}
*反射成员变量
import java.lang.reflect.Field;
/*
掌握:
成员变量的反射
*/
public class _6_ReflectTest3
{
public static void main(String[] args) throws Exception
{
ReflectPoint rp=new ReflectPoint(3,5);
//Field fieldY=rp.getClass().getField("y");
//int y=(Integer)fieldY.get(rp);
//System.out.println(y);
Field fieldX=rp.getClass().getDeclaredField("x");
fieldX.setAccessible(true);
int x=(Integer)fieldX.get(rp);
System.out.println(x);
changeStringValue(rp);
System.out.println(rp);
}
private static void changeStringValue(Object obj) throws Exception
{
Class cla=obj.getClass();
Field[] fields=cla.getFields();
for(Field field:fields)
{
if(field.getType()==String.class)
{
String oldStr=(String)field.get(obj);
String newStr=oldStr.replace('b', 'a');
field.set(obj, newStr);
}
}
}
}
*成员方法的反射
import java.lang.reflect.Method;
/*
成员方法的反射
*/
public class _7_ReflectTest
{
public static void main(String[] args) throws Exception
{
String str="abcd";
System.out.println(methodCharAt(str));
}
private static Object methodCharAt(Object obj) throws Exception
{
Class cla=obj.getClass();
Method me=cla.getMethod("charAt", int.class);
return me.invoke(obj, 1);
}
}
3,反射涉及API
Class
public Constructor<?>[] getConstructors()
public Constructor<T> getConstructor(Class<?>... parameterTypes)
public T newInstance()
public Field getField(String name)
public Field getDeclaredField(String name)
public Method getMethod(String name,Class<?>... parameterTypes)
public Method getDeclaredMethod(String name,Class<?>... parameterTypes)
public boolean isPrimitive()
Constructors
public T newInstance(Object... initargs)
Field
public void setAccessible(boolean flag)
public Object get(Object obj)
public Class<?> getType()
public void set(Object obj,Object value)
Method
public void setAccessible(boolean flag)
public Object invoke(Object obj,Object... args)