- 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());
- }
- }
浙公网安备 33010602011771号