java-反射示例

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());
	}
}

转载于:https://my.oschina.net/dendy/blog/398166

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值