黑马程序员——反射

来源:互联网 发布:centos 查看硬盘分区 编辑:程序博客网 时间:2024/05/20 06:38
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
反射
Class类:
      Java中的类描述一类事物的共性,该类事物有什么属性,没有什么属性。但是这个类不管这些属性的具体值,类只负责描述这些属性。属性的具体值,是由这个类的具体实例对象来确定的。这些类,也可以理解为Java中的同一类事物,而用来描述这些类的类,就是Class类。每一个Java类都会有类名,包名,成员变量,方法,父类等等,这些属性,都可以在Class类中获取。如何得到Class类的对象?首先,Class对象对应的是内存中的字节码文件。字节码文件是源代码编译好的class文件,当要使用某个类的对象时,要将Class文件加载到内存,用这个字节码复制出一个一个对象。Java程序中用了几个类,就有几份字节码;这些字节码就是Class类的对象。
反射技术:其实就是动态加载一个指定的类,并获取该类中的所有的内容。而且将字节码文件封装成对象,并将字节码文件中的内           容都封装成对象,这样便于操作这些成员。简单说:反射技术可以对一个类进行解剖。

反射的好处:大大的增强了程序的扩展性。

反射的基本步骤:

1)获得Class对象,就是获取到指定的名称的字节码文件对象。

2)实例化对象,获得类的属性、方法或构造函数。

3)访问属性、调用方法、调用构造函数创建对象。

获取类对象的方式(三种)

1. 类名.class

Class c = Student.class;

Class i = int.class();//8种基本数据类型也有类对象

 

2. getClass()方法(Object类定义)

以前讲的获取对象的实际类型(不准确),应该是获得某个类的类对象

Student s = new Student();

Class cs1 = s.getClass();

Class cs2 = Student.class;

不管是类的什么对象,不管以什么方式,获得的都是同一个类对象

 

3.Class.forName()方法

public static Class forName(String className) throwsClassNotFoundException

 

Class c = Class.forName(“ex04.Student”);//全限定名

Class.forName():类加载方法

 

类对象的作用

1.  类对象的作用——获得类信息

2. 常用方法

1)  getName():获得类的名称,包括包名

2)getSimpleName():获得类的名称,不包括包名

3) getSuperClass():获得本类的父类的类对象

4) getInterfaces():获得本类所实现的所有接口的类对象

3. 方法

1) public Method[] getDeclaredMethods()throws SecurityException

2) public Method[] getMethods()throws SecurityException

3) Method(java.lang.reflect.Method)

4) 获得对象的方法

                       i.获得所有的公开方法(包括本类和继承)

                     ii.获得所有的本类中定义的方法(公开、私有方法都能获得)

4.  属性

1) Field[] getDeclaredFields();

2)Field[] getFields();

3)  Field:属性,也称字段,属性信息包括修饰符、类型、属性名

4)获得对象的属性

                       i.获得所有的公开属性(包括父类)

                      ii. 获得本类中定义的属性

5.使用类对象创建类的对象

反射包

 1.java.lang.reflect.Field类

 通过Class对象的如下方法可以获得Field对象

FieldgetDeclaredField(String name);//name:属性名

FieldgetField(String name)

Field[]getDeclaredField();

Field[]getField()

 Class:java.lang.Class                                

 Field类的常用方法

                       i.getName();//获得属性

                      ii.   属性赋值、获取

                            public void set(Objectobj,Objectvalue);

                            public Objectget(Object obj);

                      iii. public void Accessible(booleanflag)

                       直接操作私有属性,打破封装

 

2.java.lang.reflect.Method类

 通过Class对象的如下方法可以获得Method对象

public Method[] getDeclaredMethods();

public Method[] getMethods();

public Method getMethod(String name,Class[] parameterTypes);

public Method getDeclaredMethod(String name,Class[]parameterTypes);

1) Student类

2) 通过调用Method.invoke(Object,Object[])执行方法;

 

 3.java.lang.reflect.Constructor类

通过Class对象的如下方法可以获得Constructor对象

Constructor[]getConstructors();

Constructor[]getDeclaredConstructors();//可以获得私有的构造方法

Constructor getConstructor(Class[]parameters);

ConstructorgetDeclaredConstructor(Class[] parameters);


0 0
原创粉丝点击