您的位置:首页 > 编程语言 > Java开发

java反射基础

2011-10-05 20:46 423 查看
 1,三种获得Class对象的方法

@Test
public void test1() throws Exception{

//类名.class
Class c1 = String.class;

//对象名.getClass()
Class c2 = new String().getClass();

//Class.forName("类的完整路径")
Class c3 = Class.forName("java.lang.String");

//相等
if(c2==c3){
System.out.println("相等");
}
}

 

2,构造方法创建对象

public class Demo2 {
//用反射方法通过空参构造方法创建一个对象
@Test
public void test1(){
try {
Class clazz = Class.forName("cn.itcast.java.reflect.Person");
//取得构造方法
Constructor c = clazz.getConstructor(null);
//创建实例
Person person = (Person)c.newInstance(null);
//调用业务方法
person.show();
} catch (Exception e) {
e.printStackTrace();
}
}
//用反射方法通过有参构造方法创建一个对象
@Test
public void test2(){

try {
Class clazz = Class.forName("cn.itcast.java.reflect.Person");
//取得构造方法[参数类型的Class对象]
Constructor c = clazz.getConstructor(String.class,int.class);
//创建实例[真实参数]
Person person = (Person)c.newInstance("jack",31);
//调用业务方法
person.show();
} catch (Exception e) {
e.printStackTrace();
}
}
//用反射方法通过私有构造方法创建一个对象
@Test
public void test3(){
try {
Class clazz = Class.forName("cn.itcast.java.reflect.Person");
//取得类中声明的所有构造方法(包含private或protected)
Constructor c = clazz.getDeclaredConstructor(String.class,String[].class);
//设置该private的构造方法是否可以被访问
c.setAccessible(true);
Person person = (Person) c.newInstance("jack",new String[]{"唱歌","跳舞"});
person.show();
} catch (Exception e) {
e.printStackTrace();
}
}
//用反射方法通过私有空参构造方法创建一个对象
@Test
public void test4(){
try {
Class clazz = Class.forName("cn.itcast.java.reflect.Person");
Constructor c = clazz.getDeclaredConstructor(null);
c.setAccessible(true);
Person person = (Person) c.newInstance(null);
person.show();
} catch (Exception e) {
e.printStackTrace();
}
}
}


3.字段反射

@Test
public void test1() throws Exception{
Person p = new Person();
Class clazz = Class.forName("cn.itcast.java.reflect.Person");
//取得字段[字段的名字]
Field f = clazz.getField("name");
//向字段存值[引用变量名,真实值]
f.set(p,"jack");//new Person().setName("jack")
//取得字段的值
System.out.println("用户名:" + p.name);
}
@Test
public void test2() throws Exception{
Person p = new Person();
Class clazz = Class.forName("cn.itcast.java.reflect.Person");
Field f = clazz.getDeclaredField("age");
f.setAccessible(true);
f.set(p,"31");
System.out.println("年龄:" + p.getAge());
}

4,方法反射

@Test
public void test1() throws Exception{
Class clazz = Class.forName("cn.itcast.java.reflect.Person");
//参数一:方法名
//参数二:方法参数对应的Class对象
Method m = clazz.getMethod("show",null);
//参数一:引用变量
//参数二:真实值
m.invoke(new Person(),null);
}
@Test
public void test2() throws Exception{
Class clazz = Class.forName("cn.itcast.java.reflect.Person");
//参数一:方法名
//参数二:方法参数对应的Class对象
Method m = clazz.getMethod("show",String.class,int.class);
//参数一:引用变量
//参数二:真实值
m.invoke(new Person(),"jack",31);
}
@Test
public void test3() throws Exception{
Class clazz = Class.forName("cn.itcast.java.reflect.Person");
//参数一:方法名
//参数二:方法参数对应的Class对象
Method m = clazz.getMethod("show",int[].class);
//参数一:引用变量
//参数二:真实值
String value = (String) m.invoke(new Person(),new int[]{1,2,3,4});
System.out.println("value=" + value);
}
@Test
public void test4() throws Exception{
Class clazz = Class.forName("cn.itcast.java.reflect.Person");
//参数一:方法名
//参数二:方法参数对应的Class对象
Method m = clazz.getDeclaredMethod("hello",String.class);
//参数一:引用变量
//参数二:真实值
m.setAccessible(true);
int value = (Integer) m.invoke(new Person(),"marry");
System.out.println("value=" + value);
}


5,主函数反射

public static void main(String[] args) throws Exception {
Class clazz = Class.forName("cn.itcast.java.reflect.Person");
Method m = clazz.getMethod("main",String[].class);
//如果是静态类型,参数一为null。
//m.invoke(null,new String[]{"A","C","D","E"});
//m.invoke(null,new Object[]{new String[]{"A","C","D","E"}});
m.invoke(null,(Object)new String[]{"A","C","D","E"});
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息