java中的反射 java反射有什么用( 二 )


  1. 配置文件开启注解驱动,相关类与方法通过注解 @Transactional 标识 。
  2. spring启动会解析相关bean,此时查看相关注解类与方法,并且为这些类与方法生成代理,根据@Transactional 相关参数进行配置
  3. 真正数据库层的事务提交与回滚通过binlog或者redo log实现 。


声明式事务:Spring支持声明式事务,使用注解选择需要使用事务的方法,使用@Transactional注解在方法上表明方法需要事务支持,基于AOP的实现操作 。
AOP代理的两种实现:
  • jdk是代理接口,私有方法不会存在接口里,因此不会拦截到 。
  • cglib是子类,private方法不会出现在子类,不会被拦截 。


Java动态代理具体有如下四步骤:
  1. 实现invocationHandler接口创建自己的调用处理器
  2. 通过Proxy类指定ClassLoader对象与interface创建动态代理类
  3. 反射机制获得动态代理类构造函数,唯一参数类型调用处理器接口类型 。
  4. 构造函数创建动态代理类实例,构造时调用处理器对象作为参数传入 。
CGLIB代理
  • cglib封装了asm,运行期间动态生成class
  • cglib用于AOP,jdk的proxy基于接口,cglib没限制 。


原理区别java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理 。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理 。
  1. 如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
  1. 如果目标对象实现了接口,可以强制使用CGLIB实现AOP
  1. 如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换
如果是类内部方法直接不是走代理,这个时候可以通过维护一个自身实例的代理 。



二、java反射有哪些用途j2ee中的其他组建,JAVA的反射是指,可以通过一个类名来探察这个类里面的信息,比如说类的属性名,属性名的修饰符,方法名,方法返回值,方法修饰符等等,反正除了方法体得不到,其他都可以用反射得到;反射还可以生成类的实例,通过这个实例定义属性,调用方法,特别是能调用私有的属性和私有的方法 。
Object obj = Class.forName("").newInstance();
public void invokeMethod(Object obj, String methodName, Object[] param)
throws Exception {
Class clazz = obj.getClass();
Class[] classArgs = new Class[param.length];
for (int i = 0; i < param.length; i++) {
classArgs[i] = param[i].getClass();
}
Method method = clazz.getMethod(methodName, classArgs);
method.invoke(obj, param);
}

三、java反射问题代码如下:
import java.lang.reflect.Field;
import java.util.Scanner;
class Student {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student [name=" + name + "]";
}
}
public class App {
public static void main(String[] args) throws Exception {
Scanner scanner = new Scanner(System.in);
String packageName = "com.baidu.demo042.";
String className = scanner.nextLine();
Class clazz = Class.forName(packageName + className);
System.out.println(clazz);
Object stu = clazz.newInstance();
System.out.println(stu);
Field field = clazz.getDeclaredField("name");
field.setAccessible(true);
field.set(stu, "Tom");
System.out.println(stu);
scanner.close();
}
}
运行结果:
java中的反射 java反射有什么用

文章插图

四、java反射应用有哪些Reflection(反射) 是 Java 程序开发语言的特征之一,它允许运行中(注意是运行时,而非编译时)的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性 。
例如,使用它能获得 Java 类中各成员的名称并显示出来,能够通过字符串形式的类名称(包括完整包名)反射性地创建类的实例,能够动态执行类方法等 。
JavaBean 是 reflection 的实际应用之一,它能让一些工具可视化的操作软件组件 。
这些工具通过 reflection 动态的载入并取得 Java 组件(类) 的属性 。
Java反射是动态程序设计的基础 。
Java语言反射提供一种动态链接程序组件的多功能方法 。