java总结

反射机制

反射的作用

  • Java反射机制允许程序在运行时透过Reflection APIs取得任意一个已知名称的class的内部信息,包括
  • modifiers(如public、static等)、superclass(如Object)、实现的interfaces(如Serializable)
  • 、fields(属性)和methods(方法)(但不包括methods定义),可于运行时改变fields的内容,也可
  • 调用methods
  • 优点:
  • 在运行时获得类的各种内容,进行反编译,对于Java这种先编译再运行的语言,能够很方便的创建灵活的代
  • 码,这些代码可以在运行时装配,无需在组件之间进行源代码的链接,更加容易实现面向对象。
  • 缺点:
    • 反射会消耗一定的系统资源,因此,如果不需要动态地创建一个对象,那么就不需要用反射
    • 反射调用方法时可以忽略权限检查,因此可能会破坏封装性而导致安全问题

反射的用途

反编译:

.class-->.java

  • 通过反射机制访问java对象的属性,方法,构造方法等
  • 当在使用IDE,比如Ecplise时,当输入一个对象或者类,并想调用他的属性和方法是,一按点号,编译器就
  • 会自动列出他的属性或者方法,这里就是用到反射。
  • 反射最重要的用途就是开发各种通用框架。比如很多框架Spring都是配置化的(比如通过XML文件配置Bean)
  • ,为了保证框架的通用性,可能需要根据配置文件加载不同的类或者对象,调用不同的方法,这个时候就必须
  • 使用到反射了,运行时动态加载需要的加载的对象
  • MyBatis持久层框架 Spring业务层框架 SpringMVC表现层框架

动态获取类的信息以及动态调用对象的方法称为Java的反射Reflection机制。

  • 反射提供了封装程序集、模块和类型的对象。在Java运行时环境中,对于任意一个类的对象,可
  • 以通过反射获取这个类的信息

Class clz = A1.class;// 获取用于指代A1类的对象 // 获取属性 Field[] fs = clz.getDeclaredFields(); // 获取当前类种所有的声明的属性 for (Field tmp : fs) System.out.println(tmp); // 获取方法 Method[] ms = clz.getDeclaredMethods();// 获取当前类种的所声明的所有方法 for (Method tmp : ms) System.out.println(tmp); // 获取构造器 Constructor[] cs=clz.getConstructors(); for(Constructor tmp:cs) System.out.println(tmp);

class类

Class类是Reflection API中的核心类,主要有以下方法:

*

    • getName():获取类的名字,例如java.util.Date
    • getFields():获取类中public类型的属性,自定义或者从父类种继承
    • getDeclaredFields():获取类的所有属性(包括public、protected、default、private),只能获取到当前类种定义,不能获取父类继承的
    • getMethods():获取类中public类型的方法
    • getDeclaredMethods():获取类的所有方法
    • getMethod(String name,Class[] parameterTypes):获取类的指定方法,name:指定方法的名字,parameterType:指定方法的参数类型
    • getDeclaredMethod
    • getConstrutors():获取类中public类型的构造方法
    • getDeclaredConstructors()
    • getConstrutor(Class[] parameterTypes):获取类的指定构造方法,parameterTypes:指定构造方法的参数类型
    • getDeclaredConstructor
    • newInstance():通过类的public不带参数的构造方法创建该类的一个对象;
  • @Deprecated(since="9")
  • 注:在访问私有属性和私有方法时,需要对访问的私有属性或方法设置setAccessible(true)使被反射的类抑制java的访问检查机制。否则会报IllegalAccessException异常。

想要使用反射机制,就必须要先获取到该类的字节码文件对象(.class),通过字节码文件对象,就能够通过该类中

  • 的方法获取到我们想要的所有信息(方法,属性,类名,父类名,实现的所有接口等等),每一个类对应着一个字节
  • 码文件也就对应着一个Class类型的对象,也就是字节码文件对象。
  • 获取字节码文件对象的三种方式。
    • Class clazz1 = Class.forName("全限定类名");  //通过Class类中的静态方法forName,直接获取到一个类的字节码文件对象,此时该类还是源文件阶段,并没有变为字节码文件
    • Class clazz2 = Person.class;    //当类被加载成.class文件时,此时Person类变成了.class,在获取该字节码文件对象,也就是获取自己, 该类处于字节码阶段
    • Class clazz3 = p.getClass();    //通过类的实例获取该类的字节码文件对象,该类处于创建对象阶段
  • Class.forName和x.class获取类对象的区别
  • //处理静态代码块和静态属性

// Class clz = Class.forName("com.yan6.class2.A1");

// System.out.println(clz);

//不会处理静态代码块和静态属性

Class clz2=A1.class;

System.out.println(clz2);

## 获取类的Class对象

Class 类的实例表示正在运行的 Java 应用程序中的类和接口。获取类的Class对象有4种方式

方法

编程调用方法

调用getClass

Boolean var1 = true;Class classType2 = var1.getClass();System.out.println(classType2);

输出:class java.lang.Boolea

运用.class 语法

Class classType4 = Boolean.class;
System.out.println(classType4);

输出:class java.lang.Boolean

运用静态方法Class.forName()

Class classType5 = Class.forName("java.lang.Boolean"); System.out.println(classType5);

输出:class java.lang.Boolean

运用primitive wrapper classes的TYPE语法,这里返回的是原生类型,和Boolean.class返回的不同

Class classType3 = Boolean.TYPE; System.out.println(classType3);

输出:boolean

public static final Class TYPE = (Class) Class.getPrimitiveClass("boolean");

总结

在JDK中,主要由以下类实现Java反射机制:

*

    • Class类:代表一个类
    • Field类:代表类的成员变量(属性)
    • Method类:代表类的方法
    • Constructor类:代表类的构造方法
    • Array类:提供了动态创建数组,以及访问数组元素的静态方法;
  • 以上类中,Class类在java.lang包,其余位于java.lang.reflect包。
  • java.lang.Object类(所有类的超类)定义了getClass()方法,任意一个Java对象都可以通过此方法获
  • 得它的class。

数据库

数据库是指长期储存在计算机内有组织可共享的数据集合。数据库中的数据以及数据之间的关系按照一定的数据模型组织,描述和储存,具有较小的沉余度,较高的数据独立性和易扩展性。并在一定的范围内可以被多个用户共享。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值