程序要使用某个类时如果该类还未被加载到内存中,则系统会通过类的加载,类的连接,类的初始化这三个步骤对类进行初始化。正常情况JVM会连续完成这三个步骤,所以有时把这三个步骤统称为类加载或类初始化。
主要对类变量进行初始化。
注意:在执行第2个步骤的时候,系统对直接父类的初始化步骤也遵循初始化步骤1-3
负责将.class文件加载到内存中,并为之生成对应的java.lang.Class对象
JVM的类加载机制
ClassLoader:负责加载类的对象
Java运行时具有以下内置类加载器
ClassLoader中的两个方法
是指在运行时去获取一个类的变量和方法信息,然后通过获取到的信息来创建对象,调用方法的一种机制。由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译期就完成确定,在运行期仍然可以扩展。
我们要想通过反射去使用一个类,首先我们要获取到该类的字节码文件对象,也就是类型为Class类型的对象
Class类中用于获取构造方法的方法
Constructor类中用于创建对象的方法
public void setAccessible(boolean flag):值为true,取消访问检查。则反射可使用私有构造方法来创建对象。
Class类中用于获取成员变量的方法
Field类中用于给成员变量赋值的方法
Class类中用于获取成员方法的方法
Method类中用于调用成员方法的方法
定义:注解(Annotation) ,也叫元数据。一 种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同-一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
作用分类:
一.格式:
二.本质:注解本质上就是一个接口,该接口默认继承Annotation接口
三.属性:接口中的抽象方法
*要求:
1.属性的返回值类型有下列取值
2.定义了属性,在使用时需要给属性赋值
四.元注解:用于描述注解的注解
1.获取注解定义的位置的对象(class, Method, Field)
2.获取指定的注解
*getAnnotation(Class)
3.调用注解中的抽象方法获取配置的属性值
动态代理是实现代理模式的一种方法,他比静态代理强在了他使用了反射,可以在运行时动态创建代理类。
代理对象接口类
package proxy;
public interface Star
{
String sing(String name);
String dance(String name);
}
代理对象接口实现类
package proxy;
public class LiuDeHua implements Star
{
@Override
public String sing(String name)
{
System.out.println("给我一杯忘情水");
return "唱完" ;
}
@Override
public String dance(String name)
{
System.out.println("开心的马骝");
return "跳完" ;
}
生成代理类
方法CreatProxyedObj返回的对象才是我们的代理类,需要三个参数,前两个参数的意思是在同一个classloader下通过接口创建出一个对象,该对象需要一个属性,也就是第三个参数,它是一个InvocationHandler。需要注意的是这个CreatProxyedObj方法不一定非得在我们的StarProxy类中,往往放在一个工厂类中。
package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class StarProxy implements InvocationHandler
{
// 目标类,也就是被代理对象
private Object target;
public void setTarget(Object target)
{
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
// 这里可以做增强
System.out.println("收钱");
Object result = method.invoke(target, args);
//该InvocationHandler包含被代理对象,并负责分发请求给被代理对象,分发前后均可以做增强
return result;
}
// 生成代理类
public Object CreatProxyedObj()
{
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
}
一般使用代理的代码过程
//new一个目标对象
Star ldh = new LiuDeHua();
//new一个InvocationHandler,将目标对象set进去
StarProxy proxy = new StarProxy();
proxy.setTarget(ldh);
//通过CreatProxyedObj创建代理对象,强转为目标对象的接口类型即可使用,实际上生成的代理对象实现了目标接口。
Object obj = proxy.CreatProxyedObj();
Star star = (Star)obj;
本文地址:https://blog.csdn.net/weixin_49369478/article/details/107373264
如对本文有疑问, 点击进行留言回复!!
Springboot项目因为kackson版本问题启动报错解决方案
Java多线程下的其他组件之CyclicBarrier、Callable、Future和FutureTask详解
网友评论