反射 类加载

Posted fangzhang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反射 类加载相关的知识,希望对你有一定的参考价值。

初学反射,学习内容做了一些笔记,比较杂乱:

1、类是java.lang.Class类的实例对象

2、new 创建对象,是静态加载类,在编译时刻就需要加载可能使用到的类。

3、Class c = user.getClass(); //已知该类的对象,可通过getClass方法获取该类的类类型

   Class c = Class.forName("类的全称"); //不仅表示了该类的类类型,还代表了动态加载类,运行时加载类是动态加载

   Word w = (Word)c.newInstance(); //通过类类型,创建该类的对象 

4、基本数据类型、void关键字等都存在类类型

 1 package com.reflect;
 2 
 3 /** 
 4 * @author 作者:方o丈
 5 * @version 创建时间:2018年6月9日 下午2:20:24 
 6 * 类说明:
 7 */
 8 public class Test {
 9 
10     public static void main(String[] args) {
11         Class c1 = int.class;
12         Class c2 = double.class;
13         Class c3 = Double.class;
14         Class c4 = String.class;
15         Class c5 = void.class;
16         
17         System.out.println(c1.getName());
18         System.out.println(c2.getName());
19         System.out.println(c3.getName());
20         System.out.println(c3.getSimpleName());
21         System.out.println(c4.getName());
22         System.out.println(c4.getSimpleName());
23         System.out.println(c5.getName());
24     }
25     
26 }

程序运行结果:

技术分享图片

5、Class类的API操作:获取类的信息

 1 package com.reflect;
 2 
 3 import java.lang.reflect.Method;
 4 
 5 /**
 6  * @author 作者:方o丈
 7  * @version 创建时间:2018年6月9日 下午9:55:59 类说明:
 8  */
 9 public class Demo {
10 
11     /**
12      * 获取类的信息,包括类的成员函数、成员变量
13      * @param obj 该对象所属类的信息
14      */
15     public static void getClassMessage(Object obj) {
16         // 首先获取类的类类型
17         Class c = obj.getClass();
18         // 获取类的名称
19         String className = c.getName();
20         System.out.println("类的名称:" + className);
21 
22         /**
23          * Method类,方法对象
24          * 
25          * 获取类的方法 getMethods()获取该类所有的public方法,包括从父类继承来的
26          * 官网注释:返回一个数组,该数组包含反映由该Class对象表示的类或接口的所有公共方法的方法对象,
27          * 包括由类或接口声明的方法以及从超类和超接口继承的方法。如果这个Class对象表示具有多个公共方法的类型,这些方法具有相同的名称和参数类型,
28          * 但返回类型不同,则返回的数组对于每个此类方法都有一个方法对象。如果这个Class对象表示类初始化方法
29          * <clinit>的类型,则返回的数组没有相应的方法对象。如果这个Class对象表示数组类型,
30          * 则返回的数组对于数组类型从对象继承的每个公共方法都有一个方法对象。它不包含克隆()的方法对象。如果这个Class对象表示一个接口,
31          * 则返回的数组不包含任何来自Object的隐式声明方法。因此,如果在此接口或其任何超接口中没有显式声明任何方法,则返回的数组的长度为0。(
32          * 请注意,表示类的Class对象总是具有从Object继承的公共方法。)如果这个Class对象表示一个基本类型或void,
33          * 那么返回的数组的长度为0。在类或由这个Class对象表示的接口的超级接口中声明的静态方法不被视为类或接口的成员。返回数组中的元素没有排序,
34          * 也没有按任何特定顺序排序。
35          * 
36          * getDeclaredMethods() 获取该类所有的自己声明的方法,不管是什么什么访问权限。但不包含从父类继承来的
37          * 官方注释:如果这个Class对象表示具有多个声明方法的类型,这些方法具有相同的名称和参数类型,但返回类型不同,
38          * 则返回的数组对于每个此类方法都有一个方法对象。如果这个Class对象表示具有类初始化方法
39          * <clinit>的类型,则返回的数组没有相应的方法对象。如果这个Class对象表示没有声明方法的类或接口,则返回的数组长度为0。
40          * 如果这个Class对象表示数组类型、基元类型或空类型,则返回的数组长度为0。返回数组中的元素没有排序,也没有按任何特定顺序排序。
41          * 
42          */
43         Method[] method = c.getMethods();
44         for (int i = 0; i < method.length; i++) {
45             //获取方法的返回值的类类型
46             Class returnTyepe = method[i].getReturnType();
47             //获取方法返回值类型名
48             System.out.print(returnTyepe.getName()+" ");
49             
50             //获取方法的名称
51             System.out.print(method[i].getName()+"(");
52             
53             //获取参数列表的类型的类类型
54             Class[] paramTypes = method[i].getParameterTypes();
55             for (Class paramType : paramTypes) {
56                 System.out.print(paramType.getName()+",");
57             }
58             System.out.println(")");
59         }
60     }
61     
62     public static void main(String[] args) {
63         Test test = new Test();
64         getClassMessage(test);
65     }
66 }

? 运行结果:

技术分享图片

 

以上是关于反射 类加载的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向类加载器 ClassLoader ( 类加载器源码简介 | BaseDexClassLoader | DexClassLoader | PathClassLoader )(代码片段

Java安全-入门篇开发基础(MavenJavaMVC反射类加载代码远程调试)

反射与类加载之反射基本概念与Class

基于反射的动态调用-不止是code和oop,还有类加载方案

java 反射代码片段

Java知识系列 -- 反射