反射——Java反射机制

java

反射概述

什么是反射?

①   反射的概念是由Smith在1982年首次提出的,主要指程序可以访问、检测和修改它本身状态或行为的一种能力。

②   JAVA反射机制是在运行状态中,对应任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种状态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。

③   简单的说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。包括其访问修饰符、父类、实现的接口、属性和方法的所有信息,并可在运行时创建对象、修改属性(包括私有的)、调用方法(包括私有的)。

 

反射机制

①   为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态和静态的概念?

a)         静态编译:在编译时确定类型,绑定对象,即通过。

 Student stu=new Student(“zhangsan”,20);

b)         动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多态的应用,用以降低类之间的耦合性。

  Class.forName(“com.mysql.jdbc.Driver.class”).newlnstance();

c)         反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性,特别是J2EE的开发中。

d)         它的缺点是对性能有影响,使用反射基本上是一种解释操作,这类操作总是慢于直接执行的相同操作。

 

Java反射机制主要提供了以下功能

①   在运行时判断任意一个对象所属的类

②   在运行时构造任意一个类的对象

③   在运行时判断任意一个类的所具有的成员变量和方法

④   在运行时调用任意一个对象的方法

 

Class对象

①   Class对象是Reflection故事起源。要想操作类中的属性和方法,都必须从获取Class对象开始。

a)         类是程序的一部分,每个类都有一个Class对象。换言之,每当编写并编译一个新类,就会产生与之对应的一个Class对象。

b)         Class类没有公共构造方法。Class对象是在加载类时由Java虚拟机以及通过调用类加载器中的方法自动构造的,因此不能显式地声明一个Class对象。

②   获取Class对象的方法有多种

 

获取方式

说明

示例

object.getClass()

获取指定示例的

Class

String str=”abc”;

Class c1=str.getClass();

class.getSuperclass()

获取当前Class

的继承类的

Class

List list=new ArrayList();

Class listClass=list.getClass();

Class superClass=

listClass.getSuperClass();

.class语法

.class直接获取

Class listClass=ArrayList.class;

Class.forName(类名);

用Class的静态方法,传入类的全称即可

Class c1=Class.

forName(“java.lang.String”);

Primitive.TYPE

基本数据类型的包装类获取Class的方式

Class longClass=Long.TYPE;

Class integerClass=Integer.TYPE;

Class voidClass=Void.TYPE;

 

 

示例:

创建一个雇员类

 1 class Employee {

2 private String name;

3 private int age;

4

5 public String getName() {

6 return name;

7 }

8

9 public void setName(String name) {

10 this.name = name;

11 }

12

13 public int getAge() {

14 return age;

15 }

16

17 public void setAge(int age) {

18 this.age = age;

19 }

20

21 public Employee(String name, int age) {

22 super();

23 this.name = name;

24 this.age = age;

25 }

26

27 }

主方法中获取Class对象:

 1     public static void main(String[] args) {

2 Employee employee = new Employee("zhansan", 20);

3

4 // 对象名.getClass()

5 /*

6 /* Class<?> classType = employee.getClass();

7 * System.out.println(classType.getName());

8 * System.out.println(classType.getSuperclass().getName());

9 */

10

11 // 类名.class

12 /*

13 * Class<?> classType=Employee.class;

14 * System.out.println(classType.getName());

15 * System.out.println(classType.getSuperclass().getName());

16 */

17

18 // 使用Class.forName();

19 /*try {

20 Class<?> classType = Class.forName("com.iotek.classtype.Employee");

21 System.out.println(classType.getName());

22 System.out.println(classType.getSuperclass().getName());

23 } catch (ClassNotFoundException e) {

24 e.printStackTrace();

25 }*/

26

27 //获取基本数据类型的Class对象

28 //Class<?> classType = int.class;

29 //System.out.println(classType.getName());

30 //System.out.println(classType.getSuperclass().getName());//无父类null值无法获取getName()

31

32 //通过基本数据类型的包装类来获取

33 //对应的基本数据类型对应的Class对象

34 //Class<?> classType=Double.TYPE;

35 //System.out.println(classType.getName());

36 //System.out.println(classType.getSuperclass().getName());

37

38 Class<?> classType=Double.class;

39 System.out.println(classType.getName());

40 System.out.println(classType.getSuperclass().getName());

41 }

42

43 }

以上是 反射——Java反射机制 的全部内容, 来源链接: utcz.com/z/390412.html

回到顶部