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 { //存数据 类似翻墙进入女厕所 ArrayListlist = 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(); } }
结果