//反射类的方法: public static void main(String[] args)
@Test
public void test6() throws Exception
{
Class clazz = Class.forName("cn.com.day1.Person");
Method method = clazz.getMethod("main", String[].class);
//method.invoke(null,new Object[] {new String[]{"aa","bb"}});
method.invoke(null,(Object)new String[]{"aa","bb"});
}
}
***************************************************邪恶的分割线**********************************************************************************************************************
//反射类的字段
[java]
import java.lang.reflect.*;
import org.junit.Test;
public class Demo3
{
//反射类的字段
@Test
public void test1()throws Exception
{
Person p = new Person();
Class clazz = Class.forName("cn.com.day1.Person");
Field f = clazz.getField("name");
String name = (String)f.get(p);
System.out.println(name);//获得nema字段的属性
//可以获得字段的类型
Class type = f.getType();
System.out.println(type);
}
}
import java.lang.reflect.*;
import org.junit.Test;
public class Demo3
{
//反射类的字段
@Test
public void test1()throws Exception
{
Person p = new Person();
Class clazz = Class.forName("cn.com.day1.Person");
Field f = clazz.getField("name");
String name = (String)f.get(p);
System.out.println(name);//获得nema字段的属性
//可以获得字段的类型
Class type = f.getType();
System.out.println(type);
}
}
下面是反射的另一个例子:
[java]
import java.lang.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.text.*;
public class ReflectTest
{
/**反射基础:
* 通过通过Class的forName(String className)、类名.class、变量.getClass()获取类的字节码
*
* 通过字节码获得类的构造函数Constructor、方法Method、成员Field等等
* @param args
*/
public static void main(String[] args)throws Exception
{
String str1 = "abc";
//三种方式加载类
Class cls1 = str1.getClass();
Class cls2 = String.class;
Class cls3 = Class.forName("java.lang.String");
//他们获得的字节码是相同的
System.out.println(cls1==cls2);
System.out.println(cls2==cls3);;
//下面再介绍几个方法 isPrimitive 判断是否基本类型 ,isArray() 判断是否是数组
System.out.println(cls1.isPrimitive());//String不是基本类型
System.out.println(int.class.isPrimitive());//int是基本类型
System.out.println(int.class == Integer.class);//这两种类型不相同
System.out.println(int.class == Integer.TYPE);//Integer使用TYPE方法转换成int
//下面介绍 构造方法的反射
//举例:完成类似 new String(new StringBuffere("abc"))
//构造方法ConStructor
Constructor constructor1 = String.class.getConstructor(StringBuffer.class);
//使用强制转换 将object强转成String类型
String str2 = (String)constructor1.newInstance(new StringBuffer("abc"));
System.out.println(str2.charAt(2));
//下面介绍成员变量的反射 用下面的ReflectPoint类
//先传递参数
ReflectPoint pt1 = new ReflectPoint(3,5);
//成员变量Field
Field fieldY = pt1.getClass().getField("y");
// filedY的值不是5 他不是对象上的变量,而是类上的,用他去取某个对象上的值
System.out.println(fieldY.get(pt1));
//下面介绍暴力反射 (分为两步),
//第一: 这里x是私有的,要用getDeclaredField
Field fieldX = pt1.getClass().getDeclaredField("x");
//第二:虽然用getDeclaredField 显示了私有的 但是不能用 ,必须用setAccessible设置成可用
fieldX.setAcc