栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > Java

java 练习 反射入门 自定义注解 动态代理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java 练习 反射入门 自定义注解 动态代理

1.设置初始类(银行类)设置私有属性及get set 方法 和 重写toString

package reflect;

public class Account {
    private String ID;
    private String name;
    private String password;
    private double money;
    private double quotaMoney;



    public Account(String ID, String name, String password, double money, double quotaMoney) {
        System.out.println("有参构造器执行");
        this.ID = ID;
        this.name = name;
        this.password = password;
        this.money = money;
        this.quotaMoney = quotaMoney;
    }

    public Account() {
        System.out.println("无参数构造器执行");
    }

    public String getID() {
        return ID;
    }

    public void setID(String ID) {
        this.ID = ID;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

    public double getQuotaMoney() {
        return quotaMoney;
    }

    public void setQuotaMoney(double quotaMoney) {
        this.quotaMoney = quotaMoney;
    }

    @Override
    public String toString() {
        return "Account{" +
                "ID='" + ID + ''' +
                ", name='" + name + ''' +
                ", password='" + password + ''' +
                ", money=" + money +
                ", quotaMoney=" + quotaMoney +
                '}';
    }
}

2.反射

第一步都要获取类

获取私有变量可以暴力获取    cons.setAccessible(true);

package reflect;

import org.junit.Test;

import java.lang.reflect.Constructor;

public class Test1 {
    @Test
    public void getAccount() throws Exception{
        //获取类对象
        Class c = Account.class;
//        //提取全部构造器的对象
//        Constructor[] constructors = c.getConstructors();
//        //遍历构造器
//        for (Constructor constructor : constructors) {
//            System.out.println(constructor.getName()+"===="+constructor.getParameterCount());
//        }

        //提取全部构造器的对象
        Constructor cons = c.getDeclaredConstructor();
        System.out.println(cons.getName()+"===="+cons.getParameterCount());
        //遇到私有构造器暴力反射
        cons.setAccessible(true);//权限打开
        Account a = (Account) cons.newInstance();
        System.out.println(a);

        System.out.println("===================================");

        Constructor cons1 = c.getDeclaredConstructor(String.class, String.class, String.class, double.class, double.class);
        System.out.println(cons1.getName()+"===="+cons1.getParameterCount());
        Account a1 = (Account) cons1.newInstance("1001","xsw","1001",1000.0,1000.0);
        System.out.println(a1);
    }
}

结果

3.获取反射对象  反射赋值

package reflect;

import org.junit.Test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.IDN;
import java.util.ArrayList;

public class Test2 {
    @Test
    public void getDeclaredFields() {
        Class c =Account.class;
        Field[] fields = c.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field.getName()+"======"+field.getType());
        }
    }

    @Test
    public void getDeclaredField() throws Exception{
        Class c = Account.class;
        Field field = c.getDeclaredField("money");
//        System.out.println(field.getName()+"=====>"+field.getType());
        //赋值
        field.setAccessible(true);
        Account account = new Account();
        field.set(account,123123);
        System.out.println(account);
        //取值
        double money = (double) field.get(account);
        System.out.println(money);
    }

    @Test
    public void set() throws Exception {
        //存数据  类似翻墙进入女厕所
        ArrayList list = new ArrayList<>();
        list.add(23);
        list.add(26);
        System.out.println(list);

        Class c = list.getClass();
        Method add = c.getDeclaredMethod("add",Object.class);
        boolean rs = (boolean) add.invoke(list,"xsw");
        System.out.println(rs);
        System.out.println(list);
    }
}

 

结果

 

4.自定义注解

package reflect;


@Mybokk(name="java",names = {"xsw","dsg"},money = 1990)
public class DemoAnnotation {
    public static void main(String[] args) {
    }
}




package reflect;

public @interface Mybokk {
    String name();
    String[] names();
    double money();//default 9.9 默认值
}

 5.*动态代理

* 1.先走代理  创建接口
* 2.代理可以为方法额外做一些辅助工作
* 3.开放真正触发对象的执行
* 4.回到代理,由代理负责返回结果给方法的调用者
package test3;

public interface Skill {
    void jump();
    void sing();
}
package test3;

public class Star implements Skill {
    private String name;
    public Star(String name){
        this.name = name;
    }

    @Override
    public void jump() {
        System.out.println(name + "开始跳舞");
    }

    @Override
    public void sing() {
        System.out.println(name+"开始唱歌");

    }
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class StarAgent {
    
    public static Skill getProxy(Star star){
        return (Skill) Proxy.newProxyInstance(star.getClass().getClassLoader(),
                star.getClass().getInterfaces(), new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("收款");
                        //去跳舞 method调用对象方法 args代表这个方法的参数
                        Object rs = method.invoke(star,args);
                        System.out.println("收尾款");
                        return rs;
                    }
                });
    }

}
public class proxy {
    public static void main(String[] args) {
        Star star = new Star("杨超越");
//        star.jump();
//        star.sing();
        Skill s2 = StarAgent.getProxy(star);
        s2.jump();
        s2.sing();
    }
}

结果

 

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1036603.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号