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

java-反射示例

2013-09-17 11:30 120 查看
package cd.itcast.day1;

import java.lang.reflect.Constructor;

/**
* 反射:就是得到类型的描述实例
*
* @author Administrator
*
* 练习:
* ReflectDemo cd.itcast.day1.User
* 任意传入一个类型,解析这个类型的结构
*
* 1,Class c=Class.forName(args[0]);
* 2,getPackage();
* 3,getSimpleName();
* 4,getDeclearFields();
* 5,getDeclareConstrcutors();
* 6,getDeclareMethods();
*/
public class ReflectDemo {
public static void main(String[] args) throws Exception {
/**
* Class:是所有类(接口)的描述 得到一个类型的描述有三种方式 1,通过类型.class得到 2,通过类型的实例得到
* 3,通过类的全限定名得到类型
*
* 直接使用类型.class没有执行类的静态代码快
*/
// Class c=User.class;
// System.out.println(c);

// User u=new User();
// Class c=u.getClass();
// System.out.println(c);
Class<?> c = Class.forName("cd.itcast.day1.User");
// test(c);
// test2();
/**
* Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
* 在反射里面,得到构造方法,方法,字段都有两对方法, getXXX:代表的这个类上面能得到的所有的(包括从父类继承的)public的XXX
* getDeclaredXXX:代表的是这个类里面自己声明的所有的 XXX
*
*/
// test3(c);
test4(c);

System.out.println(c.getName());
System.out.println(c.getSimpleName());

Class c2=User.class;
/**
* 判断给定的类是否是当前类的子类
* 给定的类:参数中的类
* 当前的类:调用isAssignableFrom方法的类
*/
System.out.println(c2.isAssignableFrom(Employee.class));

System.out.println(c2.newInstance());

Class c3=Domain.class;
Constructor con=c3.getDeclaredConstructors()[0];
con.setAccessible(true);
System.out.println(con.newInstance());
}

/**
* 方法
*/
private static void test4(Class<?> c) throws Exception {
Method[] ms=c.getDeclaredMethods();
System.out.println(Arrays.toString(ms));

Method m=c.getDeclaredMethod("getName");
System.out.println(m);

Method setter=c.getDeclaredMethod("setName",String.class);

User u=new User();
setter.invoke(u, "xxx");

String s=(String)m.invoke(u);
System.out.println(s);

Method staticm=c.getDeclaredMethod("getDefaultName");
System.out.println(staticm);

//执行静态方法
String ret=(String)staticm.invoke(null);
System.out.println(ret);
}

/**
* 得到字段
*
* @param c
* @throws Exception
*/
private static void test3(Class<?> c) throws Exception {
Field[] fs = c.getFields();
System.out.println(Arrays.toString(fs));

User u = new User();

Field f = c.getDeclaredField("name");
/**
* 获取私有字段赋值权限.私有字段不能直接赋值,需要调用setAccessible方法.
*/
f.setAccessible(true);
f.set(u, "aaaa");

System.out.println(u.getName());
}

private static void test2() throws Exception {
Class<User> uc = User.class;
Constructor<User> c = uc.getConstructor();
User u = c.newInstance();
System.out.println(u);
}

private static void test(Class<?> c) throws Exception {
// 得到类的所有构造器
Constructor<?>[] cs = c.getConstructors();
System.out.println(Arrays.toString(cs));
// 报错:NoSuchMethodException
Constructor<?> cc = c.getConstructor(Long.class, String.class);
System.out.println(cc);

/**
* Constructor用来描述构造方法的类型
*/
int i = cc.getModifiers();
System.out.println(i);

System.out.println(cc.getName());

// 得到参数的类型列表
System.out.println(Arrays.toString(cc.getParameterTypes()));

// 使用构造方法创建这个类的实例
Object o = cc.newInstance(20l, "abc");
User u = (User) o;
System.out.println(u.getName());
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: