java学习Class动态加载

来源:互联网 发布:淘宝客服转人工服务 编辑:程序博客网 时间:2024/05/21 10:27

1、通过Class获取类的成员属性

public class MyMain {     public static void main(String[] args) throws ClassNotFoundException{    //获取整个类      Class c = Class.forName("java.lang.Integer");        //获取所有的属性?      Field[] fs = c.getDeclaredFields();      //定义可变长的字符串,用来存储属性      StringBuffer str = new StringBuffer();    //最外边的public定义    str.append(Modifier.toString(c.getModifiers()) + " class "+ c.getSimpleName() +"{\n");      //里边的每一个属性      for(Field field:fs){          str.append("\t");//空格          str.append(Modifier.toString(field.getModifiers())+" ");         str.append(field.getType().getSimpleName() + " ");        str.append(field.getName()+";\n");    }      str.append("}");      System.out.println(str);     }}

执行结果如下:

public final class Integer{    public static final int MIN_VALUE;    public static final int MAX_VALUE;    public static final Class TYPE;    static final char[] digits;    static final char[] DigitTens;    static final char[] DigitOnes;    static final int[] sizeTable;    private final int value;    public static final int SIZE;    public static final int BYTES;    private static final long serialVersionUID;}

2、加载类
java中,自动定义加载类,需要继承ClassLoader,然后重写findClass方法;findclass找到目标class文件,然后交给loadClass,最后通过defineClass返回字节码类

loadClass->findClass->defineClass
所以重写findClass
findClass根据传入的名字,打开,读取二进制,然后通过defineClass返回结果
最终得到myClassLoader后,调用接口loadClass
Android为我们从ClassLoader派生出了两个类:DexClassLoader和PathClassLoader

3、动态加载

动态加载,从C++的角度理解看,获取了目标模块的类名称,并且可以通过newInstance来创建新对象,可以直接执行;此对象可以是实现了某个接口类,那么把得到的心对象转换成接口类,可以直接调用

4、声明接口类

接口类可以打包成一个jar文件,直接包含到另一个工程里,可以直接添加接口名字
需要使用哪个接口,只需要把对应的jar包含进来,然后直接输入接口名字即可
引入jar包,可以新建一个lib文件夹,然后把jar文件先导进来,这时还不能使用jar包里的文件;然后右键->BuildPath,在lib中,选中要导入的jar文件,这时才可以使用其中的接口或者类

5、获取Class类型的3中方法

        String str1 = "abc";//字符串1          String str2 = "abcd";//字符串2          //三种方式获取Class类型          Class cls1 = str1.getClass();          Class cls2 = str2.getClass();          Class cls3 = String.class;          Class cls4 = Class.forName("java.lang.String");  

获得Class对象后,即可调用newInstance进行实例化对象,然后直接使用

0 0