Java基础回顾——反射+案例

一,引言:

从大二刚开始接触java,了解其基本语法,到用swing编写图形界面的程序,到JavaWeb用SSH三大框架编写小网站,后面又学SSM,SpringBoot,SpringCloud等。可以说算是对java也不断的了解了,慢慢的入了java这个大坑,感觉还不错?。虽然学的东西越来越多,但是还是有必要时不时回顾下一些基础。

二,概述:

①反射的概念:

反射库(reflection library) 提供了一个非常丰富且精心设计的工具集,以便编写能够动态操纵Java代码的程序。这项功能被大量地应用于JavaBeans中,它是Java组件的体系结构。使用反射,Java可以支持Visual Basic用户习惯使用的工具。特别是在设计或运行中添加新类时,能够快速地应用开发工具动态地查询新添加类的能力。能够分析类能力的程序被称为反射(reflective)。反射机制的功能极其强大。

利用反射机制可以:

●在运行中分析类的能力。
●在运行中查看对象,例如,编写一个toString方法供所有类使用。
●实现数组的操作代码。
●利用Method对象,这个对象很像C++中的函数指针。

——《Java核心技术 卷1 第八版》

 更简单的描述:

反射:将类的各个组成部分封装为其它对象。(其它对象指Class类对象)

三,获取字Class对象的三种方法:

①Java代码在计算机中经历的阶段:

 在三个阶段分别对应不同的获取方法:

②源代码阶段:Class.forName("全类名");

多用于配置文件。

static Class<?>    forName(String className)
//Returns the Class object associated with the class or interface with the given string name.
static Class<?>    forName(String name, boolean initialize, ClassLoader loader)
//Returns the Class object associated with the class or interface with the given string name, using the given class loader.

③Class类对象阶段:类名.class

多用于传参。

java.lang.Object java.lang.Class<T>
/*
 *Type Parameters:
 *T - the type of the class modeled by this Class object.
 *For example, the type of String.class is Class<String>.
 * Use Class<?> if the class being modeled is unknown.
 */

④运行时阶段:对象.getClass();

Class<?>    getClass()
//Returns the runtime class of this Object.

 注:不论通过以上哪一种方式获取的Class对象,同一个字节码文件(* .class)在一次程序运行过程中,只会被加载一次。

四,Class对象常用方法(java.lang.Class):

①Class对象获取成员变量:

获取公有的成员变量:

Field    getField(String name)
//Returns a Field object that reflects the specified public member field of the class or interface represented by this Class object.
Field[]    getFields()
//Returns an array containing Field objects 
//reflecting all the accessible public fields of the class or interface represented by this Class object.

获取该类下的所有成员变量:

Field    getDeclaredField(String name)
//Returns a Field object that reflects the specified declared field of the class or interface represented by this Class object.
Field[]    getDeclaredFields()
//Returns an array of Field objects reflecting all the fields declared by the class or interface represented by this Class object. 

②Class对象获取构造方法:

获取公有的构造方法

Constructor<T>    getConstructor(Class<?>... parameterTypes)
//Returns a Constructor object that reflects the specified public constructor of the class represented by this Class object.
Constructor<?>[]    getConstructors()
//Returns an array containing Constructorobjects reflecting all 
//the public constructors of the class represented by this Class object.

获取该类下所有的构造方法

Constructor<T>    getDeclaredConstructor(Class<?>... parameterTypes)
//Returns a Constructor object that reflects the specified constructor of the class or interface represented by this Class object.
Constructor<?>[]    getDeclaredConstructors()
//Returns an array of Constructor objects reflecting all the constructors declared by the class represented by this Class object.

 

③Class对象获取成员方法:

获取公有的成员方法:

Method    getMethod(String name, Class<?>... parameterTypes)
//Returns a Method object that reflects the specified public member method of the class or interface represented by this Class object.
Method[]    getMethods()
//Returns an array containing Method objects reflecting all the public member methods of the class or interface represented by this Class object,
//including those declared by the class or interface and those inherited from superclasses and superinterfaces.

获取所有的成员方法:

Method[]    getDeclaredMethods()
//Returns an array of Method objects reflecting all the methods declared by the class or interface represented by this Class object.
Class<?>    getDeclaringClass()
//If the class or interface represented by this Class object is a member of another class, returns the Class object representing the class in which it was declared.

 

④Class对象获取其它信息:

int    getModifiers()
// 获取修饰符
// 数字形式的public, protected, private, final, static, abstract and interface; 
// 可调用Modifier类中方法将其转为可识别的字符表示
// Returns the Java language modifiers for this class or interface, 
// encoded in an integer.

String    getName()
// 获取类名(eg:java.lang.String)
// Returns the name of the entity (class, interface, array class, primitive type, or void) 
// represented by this Class object, as a String.

String    getSimpleName()
//  获取简单类名
// Returns the simple name of the underlying class as given in the source code.

T    newInstance()
// 创建该类的无参构造方法
// Creates a new instance of the class represented by this Class object.

Package    getPackage()
// 获取包
// Gets the package for this class.

⑤注(访问没有访问权限的内容):

设置忽略访问权限修饰符的安全检查

public static void setAccessible(AccessibleObject[] array,
                 boolean flag) throws SecurityException
/*
 *Convenience method to set the accessible flag for an array of objects with a  
 *single security check (for efficiency).
 *First, if there is a security manager, its checkPermission method is called with a  
 *ReflectPermission("suppressAccessChecks") permission.
 *
 *A SecurityException is raised if flag is true but accessibility of any of the  
 *elements of the input array may not be changed (for example, if the element  
 *object is a Constructor object for the class Class). In the event of such a  
 *SecurityException, the accessibility of objects is set to flag for array elements  
 *upto (and excluding) the element for which the exception occurred; the  
 *accessibility of elements beyond (and including) the element for which the  
 *exception occurred is unchanged.
 */

 

五,Field对象常用方法(java.lang.reflect.Field):

Object    get(Object obj)
// 获取field值
// Returns the value of the field represented by this Field, on the specified object.

void    set(Object obj, Object value)
// 设置field值
// Sets the field represented by this Field object on the specified object argument to the specified new value.

六,Constructor对象常用的方法(java.lang.reflect.Constructor):

T    newInstance(Object... initargs)
// 创建对象
// Uses the constructor represented by this Constructor object 
// to create and initialize a new instance of the constructor's declaring class, 
// with the specified initialization parameters.

七,Method对象常用的方法(java.lang.reflect.Method):

Object    invoke(Object obj, Object... args)
// 调用当前Method对象中的方法
// Invokes the underlying method represented by this Method object,
// on the specified object with the specified parameters.

 

八,反射案例(通过反射编写可以创建任意类对象,且执行其任意方法的工具类):

demo.properties

className=demo.Student
methodName=listen

ReflectDemo

**
 * @ClassName demo.ReflectDemo
 * @Description TODO
 * @Author flytree
 * @Date 2019/9/3 19:48
 */
public class ReflectDemo {
    public static void main(String[] args) throws Exception {
        // 1.加载配置文件
        Properties properties = new Properties();
        // 1.1创建Properties对象
        // 1.2加载配置文件并转换为一个集合
        // 1.2.1获取class目录下的配置文件
        ClassLoader classLoader = ReflectDemo.class.getClassLoader();
        InputStream stream = classLoader.getResourceAsStream("demo.properties");
        properties.load(stream);

        // 2.获取配置文件中定义的数据
        String className = properties.getProperty("className");
        String methodName = properties.getProperty("methodName");

        // 3.加载此类进入内存
        Class cls = Class.forName(className);
        // 4.创建对象
        Object obj = cls.newInstance();
        // 5.获取方法对象
        Method method = cls.getMethod(methodName);
        // 6.执行方法
        method.invoke(obj);
    }
}

 

 参考

JavaAPI:api=jdk_7u4

转载于:https://www.cnblogs.com/flytree/p/11452264.html

1.1 Java语言发展简史2 1.2 认识Java语言3 1.2.1 Java语言特性3 1.2.2 JavaApplet4 1.2.3 丰富的类库4 1.2.4 Java的竞争对手5 1.2.5 Java在应用领域的优势7 1.3 Java平台的体系结构7 1.3.1 JavaSE标准版8 1.3.2 JavaEE企业版10 1.3.3 JavaME微型版11 1.4 JavaSE环境安装和配置12 1.4.1 什么是JDK12 1.4.2 JDK安装目录和实用命令工具介绍12 1.4.3 设置环境变量13 1.4.4 验证配置的正确性14 1.5 MyEcilpse工具介绍JavaSE环境安装和配置15 1.6 本章练习16 第2章 2.1 什么是程序18 2.2 计算机中的程序18 2.3 Java程序19 2.3.1 Java程序中的类型19 2.3.2 Java程序开发三步曲21 2.3.3 开发Java第一个程序21 2.3.4 Java代码中的注释23 2.3.5 常见错误解析24 2.4 Java类库组织结构和文档27 2.5 Java虚拟机简介28 2.6 Java技术两种核心运行机制29 2.7 上机练习30 第3章 3.1 变量32 3.1.1 什么是变量32 3.1.2 为什么需要变量32 3.1.3 变量的声明和赋值33 3.1.4 变量应用实例33 3.2 数据的分类34 3.2.1 Java中的八种基本数据类型34 3.2.2 普及二进制36 3.2.3 进制间转换37 3.2.4 基本数据类型间转换38 3.2.5 数据类型应用实例38 3.2.6 引用数据类型39 3.3 关键字.标识符.常量39 3.3.1 变量命名规范39 3.3.2 经验之谈-常见错误的分析与处理40 3.3.3 Java标识符命名规则41 3.3.4 关键字42 3.3.5 常量42 3.4 运算符43 3.4.1 算术运算符43 3.4.2 赋值操作符45 3.4.3 关系操作符47 3.4.4 逻辑操作符48 3.4.5 位操作符49 3.4.6 移位运算符49 3.4.7 其他操作符50 3.5 表达式52 3.5.1 表达式简介52 3.5.2 表达式的类型和值52 3.5.3 表达式的运算顺序52 3.5.4 优先级和结合性问题52 3.6 选择结构54 3.6.1 顺序语句54 3.6.2 选择条件语句54 3.6.3 switch结构59 3.6.4 经验之谈-常见错误的分析与处理65 3.6.5 Switch和多重if结构比较66 3.7 循环语句66 3.7.1 While循环67 3.7.2 经验之谈-常见while错误70 3.7.3 do-while循环72 3.7.4 for循环74 3.7.5 经验之谈-for常见错误76 3.7.6 循环语句小结78 3.7.7 break语句79 3.7.8 continue语句82 3.8 JavaDebug技术84 3.9 本章练习85 第4章 4.1 一维数组90 4.1.1 为什么要使用数组90 4.1.2 什么是数组91 4.1.3 如何使用数组92 4.1.4 经验之谈-数组常见错误97 4.2 常用算法98 4.2.1 平均值,最大值,最小值98 4.2.3 数组排序102 4.2.3 数组复制103 4.3 多维数组105 4.3.1 二重循环105 4.3.2 控制流程进阶107 4.3.3 二维数组111 4.4 经典算法113 4.4.1 算法-冒泡排序113 4.4.2 插入排序115 4.5 增强for循环116 4.6 本章练习117 第5章 5.1 面向过程的设计思想120 5.2 面向对象的设计思想120 5.3 抽象121 5.3.1 对象的理解121 5.3.2 Java抽象思想的实现122 5.4 封装124 5.4.1 对象封装的概念理解124 5.4.2 类的理解125 5.4.3 Java类模板创建125 5.4.4 Java中对象的创建和使用127 5.5 属性130 5.5.1 属性的定义130 5.5.2 变量131 5.6 方法132 5.6.1 方法的定义132 5.6.2 构造方法135 5.6.4 方法重载138 5.6.5 自定义方法138 5.6.6 系统提供方法139 5.6.7 方法调用140 5.6.8 方法参数及其传递问题144 5.6.9 理解main方法语法及命令行参数147 5.6.1 0递归算法147 5.7 this关键字148 5.8 JavaBean149 5.9 包150 5.9.1 为什么需要包?150 5.9.2 如何创建包151 5.9.3 编译并生成包:151
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值