千锋Java&Day52课后作业

今天学习了类加载、类加载器、类反射机制,反射获取构造方法、反射获取成员变量,反射获取方法、反射越过泛型检查,反射通用方法,反射结合配置文件,静态代理设计模式。

作业

  • 反射获取构造方法
public static void main(String[] args) throws Exception{
		//获取User类对应的Class对象
        Class<?> class1 = Class.forName("demo.User");
        //获取无参构造方法对象
        Constructor<?> c1 = class1.getConstructor();
        //使用无参创建User类对象
        Object obj1 = c1.newInstance();
        System.out.println(obj1);
        System.out.println("------------------------");
	
		//获取User类对应的有参构造方法对象
        Constructor<?> c2 = class1.getConstructor(Integer.class,String.class,String.class);
        //使用有参创建User对象
        Object obj2 = c2.newInstance(1,"tom","123456");
        System.out.println(obj2);
        System.out.println("------------------------");


        Constructor<?> c3 = class1.getDeclaredConstructor(String.class,String.class);
        //暴力反射,让私有构造器对象可以被外部访问
        c3.setAccessible(true);
        Object obj3 = c3.newInstance("mike","654321");
        System.out.println(obj3);
  • 反射获取成员变量
public static void main(String[] args) throws Exception{
		//获取User类的Class对象
        Class<User> userClass = User.class;
        User user = userClass.newInstance();

		//操作public修饰的成员变量
        Field idField = userClass.getField("id");
        //设置该成员变量值
            //obj:需要设置的对象
            //value:需要设置的值
            //给user对象的id属性设置值为250
        idField.set(user,250);
        //获取该成员变量值
        Object idValue = idField.get(user);
        System.out.println(idValue);

		//操作非public修饰的成员变量
        Field usernameField = userClass.getDeclaredField("username");
        usernameField.setAccessible(true);
        usernameField.set(user,"tom");
        Object namevalue = usernameField.get(user);
        System.out.println(namevalue);
   }
  • 反射获取方法
public static void main(String[] args) throws Exception{
		//获取User类的Class对象
        Class<User> userClass = User.class;

		//获取public修饰的成员方法
        User user = userClass.newInstance();
        //使用方法对象
        //obj:哪个对象在执行该方法
        //args:方法执行时所需的参数值
        Method method1 = userClass.getMethod("setPassword", String.class);
        method1.invoke(user,"123456");
        System.out.println(user);
        System.out.println("-------------------");

		//操作非public修饰的成员方法
        Method method2 = userClass.getDeclaredMethod("show");
        method2.setAccessible(true);
        method2.invoke(user);
    }
  • 反射越过泛型检查
public static void main(String[] args) throws Exception{
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);

        Class<? extends List> listClass = list.getClass();
        Method add = listClass.getDeclaredMethod("add",Object.class);
        add.setAccessible(true);
        Object result = add.invoke(list,"hello world");
        System.out.println(result);
        System.out.println(list);
    }
  • 给指定对象的指定字段设置指定值
public static void main(String[] args) throws Exception{
        User user = new User();
        setValue(user,"id",10);
        System.out.println(user);
    }

    /**
     * 给指定对象的指定属性设置指定值
     * @param obj 指定对象
     * @param fielName 指定属性
     * @param value 指定值
     */
    public static void setValue(Object obj,String fielName,Object value)throws Exception{
        Class<?> clazz = obj.getClass();
        String methodName = "set" + fielName.substring(0,1).toUpperCase()+fielName.substring(1);
        //System.out.println(methodName);

        Field field = clazz.getDeclaredField(fielName);

        Class<?> fieldType = field.getType();

        Method method = clazz.getMethod(methodName,fieldType);

        method.invoke(obj,value);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值