反射:
1.反射就是被视为动态的语言的关键,反射通过某些API来进行获取任何类中的内部信息
,并还可以进行操作任何对象内部的属性与方法
功能:
获取任意对象的属性和方法,并且还可以进行修改对应的值,
成员变量,进行构建任意一个类的对象,进行判断任意一个对象所属的类
API
java.lang.reflect 类 Method 代表类的方法
java.lang.reflect 类 Field 成员变量
java.lang.reflect 类 Constructor<t> 构造方法
3种方式</t>
Class类中常用的方法
static Class forName(String className) 返回与带有给定字符串名的类或接口相关联的 Class 对象 T newInstance() 创建此 Class 对象所表示的类的一个新实例。 Class getSuperclass() 返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。 Class[] getInterfaces()
确定此对象所表示的类或接口实现的接口。
ClassLoader getClassLoader()
返回该类的类加载器。
Constructor<t> getConstructor(Class... parameterTypes) 返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。 Constructor[] getConstructors()
返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。
Field getField(String name)
返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。
Field[] getFields()
返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。
Method getMethod(String name, Class<?>... parameterTypes)
返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。
Method[] getMethods()
返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。
使用这些方法
获取构造函数</t>
获取方法 Method
获取方法的名称和参数的类型
获取对应的属性 来进行指定设置属性的值
案列
动态代理
CGLIB后面讲解
1.动态代理,是指客户通过代理类来进行调用其他的对象方法,并且是在程序运行的时候,根据需求来进行动态的创建目标类
的代理对象
如:地主家的傻大儿子, 找个贴身丫鬟,
2.代理设计模式的原理 1.使用一个代理将对象包装起来,然后用该代理对象取代原始对象 2.任何对原始对象的调用都要通过代理对象来进行实现 3.代理对象决定是否以及何时来进行调用原始对象上的方法。
Proxy
1.使用动态代理必须要有一个接口,那么有了接口就有对应的实现类
接口
public interface IUsersDao {
public void login();
public void submit();
}
实现
public class UsersDaoImp implements IUsersDao {
@Override
public void login() {
//开启事务 。数据验证
System.out.println("-----------我进行登录了");
//关闭事务 日志的记录
}
@Override public void submit() { //开启事务 。数据验证 System.out.println("我进行提交了-----------------"); //关闭事务 日志的记录 } } 代理 public class MyUsersDaoImp implements InvocationHandler { private Object object; public MyUsersDaoImp(Object object) { this.object = object; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("数据验证----的业务逻辑"); //进行调用原始对象的需要执行的方法 如 login 和 submit 方法 method.invoke(object,args); System.out.println("日志记录的业逻辑"); return null; } }
调用
public static void main(String[] args) { UsersDaoImp usersDaoImp = new UsersDaoImp(); /*usersDaoImp.login(); usersDaoImp.submit();*/ System.out.println("---------------"); MyUsersDaoImp myUsersDaoImp = new MyUsersDaoImp(usersDaoImp); //使用动态代理的Proxy 类进行实现代理调用的方法 //newProxyInstance 返回一个指定接口的代理类实例 /* * loader - 定义代理类的类加载器 interfaces - 代理类要实现的接口列表 h - 指派方法调用的调用处理程序 * */ IUsersDao iUsersDao = (IUsersDao) Proxy.newProxyInstance(usersDaoImp.getClass().getClassLoader(), usersDaoImp.getClass().getInterfaces(), myUsersDaoImp); iUsersDao.login(); System.out.println("-------"); iUsersDao.submit(); }