.ent做的网站有哪些,推广网站免费,网站开发成本如何账务处理,个人网站开发 怎么赚钱目录
1、什么是反射
2、Class类
3、通过Class类取得类信息/调用属性或方法
4、静态代理和动态代理
5.类加载器原理分析
6、JavaBean 1、什么是反射 Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息#xff0c;从而操作类或对象的属性和方法。本质是JVM得…目录
1、什么是反射
2、Class类
3、通过Class类取得类信息/调用属性或方法
4、静态代理和动态代理
5.类加载器原理分析
6、JavaBean 1、什么是反射 Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息从而操作类或对象的属性和方法。本质是JVM得到class对象之后再通过class对象进行反编译从而获取对象的各种信息。 一张图来表示 如果编译不知道类或对象的具体信息此时应该如何做呢这时就要用到反射来实现。 Java属于先编译再运行的语言程序中对象的类型在编译期就确定下来了而当程序在运行时可能需要动态加载某些类这些类因为之前用不到所以没有被加载到JVM。通过反射可以在运行时动态地创建对象并调用其属性不需要提前在编译期知道运行的对象是谁。 2、Class类 在Java中java.lang.Class 提供了在运行时访问对象的属性和类型信息的能力可以说它是反射的入口。 Class 类可以理解为包含了很多类的类其中它包括类名构造方法属性方法。 得到Class类的对象有三种方式 第一种形式Object类中的getClass()方法 第二种形式类.class 第三种形式通过Class类的forName方法 用法示例
public class Demo {private static Object Demo;public static void main(String[] args) throws ClassNotFoundException {person p1new person();Class cp1.getClass();//第一种形式Object类中的getClass()方法System.out.println(c);System.out.println(person.class);//第二种形式类.classClass aclassClass.forName(person);//第三种形式通过Class类的forName方法,需要抛出异常throws ClassNotFoundException}
} 使用Class类进行对象的实例化操作调用无参构造进行实例化 public T newInstance() throws InstantiationException,IllegalAccessException JAVA 9 之后弃用 newInstance() 方法解决办法 调用有参构造进行实例化 public Constructor?[] getConstructors() throws SecurityException 3、通过Class类取得类信息/调用属性或方法 取得类所在的包 public Package getPackage() //得到一个类所在的包 public String getName() //得到名字 取得一个类中的全部方法 public Method[] getMethods() public int getModifiers() //Modifier.toString(mod); // 还原修饰符 public Class? getReturnType() public Class?[] getParameterTypes() public Class?[] getExceptionTypes() public static String toString(int mod) 取得一个类中的全部属性 public Field[] getFields() public Field[] getDeclaredFields() public Class? getType() public int getModifiers() public String getName() 调用类中的方法 调用类中的方法传入实例化对象以及具体的参数内容 public Object invoke(Object obj,Object... args) 直接调用属性 取得属性 public Object get(Object obj) // 设置属性等同于使用“ ”完成操作 public void set(Object obj,Object value) // 让属性对外部可见 public void setAccessible(boolean flag) 其中带Declared的方法可以获取到私有属性或方法不带Declared的只能获取公有属性或方法 用法示例
public class Demo {private static Object Demo;public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {Class p1person.class;Field[] fieldsp1.getDeclaredFields();//获取私有属性和公有属性下同Field[] fields1p1.getFields();//仅获取公有属性,下同for (Field f:fields){System.out.println(f);}System.out.println(-----------);for (Field f1:fields1){System.out.println(f1);}System.out.println(-----------);Method[] methodsp1.getDeclaredMethods();for (Method m1:methods) {System.out.println(m1);}System.out.println(-----------);Constructor[] constructorp1.getDeclaredConstructors();for (Constructor c:constructor) {System.out.println(c);System.out.println(c.getName());System.out.println(c.getParameterCount());}System.out.println(-----------);Package pp1.getPackage();System.out.println(p);for (int i 0; i fields.length; i) {int mmfields[i].getModifiers();System.out.println(mmModifier.toString(mm)/ /fields[i].getType()/ /fields[i].getName());}System.out.println(-----------);Constructor? constructor1p1.getDeclaredConstructor();constructor1.setAccessible(true);person pp (person) constructor1.newInstance();Method m3p1.getMethod(run,String.class);m3.invoke(p1,111);}}
4、静态代理和动态代理 代理模式Proxy 为其他对象提供一种代理以控制对这个对象的访问。 代理模式说白了就是“真实对象”的代表在访问对象时引入一定程度的间接性因为这 种间接性可以附加多种用途 静态代理代理对象与目标对象一起实现相同的接口或者继承相同父类 动态代理 所谓动态代理即通过代理类Proxy的代理接口和实现类之间可以不直接发生联系而 可以在运行期Runtime实现动态关联。 java动态代理主要是使用java.lang.reflect包中的两个类。InvocationHandler类 public Object invoke(Object obj,Method method,Object[] obs) 其中第一个参数 obj 指的是代理类method是被代理的方法obs是指被代理的方法的参 数组。此方法由代理类来实现。Proxy类 protected Proxy(InvocationHandler h); static Class getProxyClass(ClassLoader loader,Class[] interfaces); static Object newProxyInstance(ClassLoader loader,Class[]interfaces,InvocationHandler h); 动态代理其实是在运行时生成class所以我们必须提供一组interface然后告诉他class 已经实现了这些interface而且在生成Proxy的时候必须给他提供一个handler让他 来接管实际的工作。
静态代理用法演示
定义一个接口
package com.company;public interface Action {public void doAction();
}定义类
package com.company;public class employee implements Action{Overridepublic void doAction() {System.out.println(正在工作中...);}
}
定义静态代理类
package com.company;public class Staticproxy {private Action target;public Staticproxy(Action target){this.target target;}public void work(){System.out.println(开始上班);target.doAction();System.out.println(下班啦);}}
测试类
package com.company;public class Main {public static void main(String[] args) {Action userAction new employee();Staticproxy proxy new Staticproxy(userAction);proxy.work();}
}动态代理用法演示
先定义两个接口
package com.company;public interface Buytickets {public void buytickets();
}package com.company;public interface Bookahotel {public void bookahotel();
}定义用户类
package com.company;public class User implements Buytickets,Bookahotel{Overridepublic void bookahotel() {System.out.println(开始预定酒店...);System.out.println(预定成功);}Overridepublic void buytickets() {System.out.println(开始买票...);System.out.println(购票成功);}
}定义代理类
package com.company;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class CreatProxy implements InvocationHandler {private Object target;public Object creat(Object target){this.targettarget;return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);}Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println(现在开始你的业务...);method.invoke(target,args);System.out.println(完成本次业务);return null;}
}测试类
package com.company;public class Main {public static void main(String[] args) {CreatProxy proxynew CreatProxy();User usernew User();Bookahotel a (Bookahotel) proxy.creat(user);a.bookahotel();}
}运行结果 现在开始你的业务... 开始预定酒店... 预定成功 完成本次业务 5.类加载器原理分析
1、类的加载过程 JVM将类加载过程分为三个步骤装载Load链接Link和初始化(Initialize)链接又分为三个步骤如下图所示 1) 装载查找并加载类的二进制数据 2)链接 验证确保被加载类的正确性 准备为类的静态变量分配内存并将其初始化为默认值 解析把类中的符号引用转换为直接引用 3)初始化为类的静态变量赋予正确的初始值 类加载器原理分析 2、类的初始化类什么时候才被初始化 1创建类的实例也就是new一个对象 2访问某个类或接口的静态变量或者对该静态变量赋值 3调用类的静态方法 4反射Class.forName(com.vince.Dog) 5初始化一个类的子类会首先初始化子类的父类 6JVM启动时标明的启动类即文件名和类名相同的那个类 3、类的加载 指的是将类的.class文件中的二进制数据读入到内存中将其放在运行时数据区的方法区内然后在堆区创建一个这个类的Java.lang.Class对象用来封装类在方法区类的对象。 6、JavaBean 什么是 JavaBean Bean理解为组件意思 JavaBean就是Java组件在广泛的理解就是一个类对于组件来 说关键在于要具有“能够被IDE构建工具侦测其属性和事件”的能力。 一个JavaBean要具备这样的命名规则 1、对于一个名称为xxx的属性通常你要写两个方法getXxx()和setXxx()。任何浏览这些 方法的工具都会把get或set后面的第一个字母自动转换为小写。 2、对于布尔型属性可以使用以上get和set的方式不过也可以把get替换成is。 3、Bean的普通方法不必遵循以上的命名规则不过它们必须是public的。 4、对于事件要使用Swing中处理监听器的方式。如addWindowListener removeWindowListener BeanUtils工具类http://apache.org/