JAVA进阶之旅(二)——认识Class类,反射的概念,Constructor,Field,Method,反射Main

JAVA进阶之旅(二)——认识Class类,反射的概念,Constructor,Field,Method,反射Main方法,数组的反射和实践

我们继续聊JAVA,这次比较有意思,那就是反射了

一.认识Class类

想要反射,你就必须要了解一个类——Class,我们知道,java程序中的各个java类都属于同一事物,我们通常用Classliability描述对吧,反射这个概念从JDK1.2就出来了,历史算是比较悠久了,这个Class可不是关键字哦,这个是一个类,他代表的是一类事物;

我们归根结底就是拿到字节码对象

这里我们有三种方式是可以得到对应的实例对象(Class类型)

1.类名.class

2.对象.getClass

3.Class.forName(“类名”);—常用

我们写一个小程序来过一遍

public class CalssTest {public static void main(String[] args) throws ClassNotFoundException {String str1 = “liu”;Class class1 = str1.getClass();Class class2 = String.class;Class class3 = Class.forName(“java.lang.String”);System.out.println(class1 == class2);System.out.println(class1 == class3);System.out.println(class2 == class3);}}

通过打印的结果我们可以知道我们都是输出同一份字节码,所以结果都是true,我们再来看,我们的Class其实还有一个方法

System.out.println(class1.isPrimitive());System.out.println(Integer.class == int.class);System.out.println(int.class == Integer.TYPE);

打印的结果是true,false,true,那这三又是什么意思呢?这个就留给大家猜想一下,应该很容易就知道了的

isPrimitive是否是基础类型或者原始类型

那我们的数组是什么类型呢?

宗旨,只要是在源程序中出现的类型,都有各自的Class类型,列入int[],Void等

二.反射的概念

好的。了解了Class类的神奇,我们就可以来看看反射的机制了

反射的概念:反射就是把JAVA类中的各种成分映射成相应的JAVA类,例如,一个java类中用一个Class类的对象来表示,一个类中的组成部分,成员变量,方法,构造方法,包等信息,也用一个个的JAVA类来表示,就像汽车是一个类,汽车中的发动机,变速箱也是一个类,表示JAVA的Class类要提供一系列的方法,来获取其中的变量,方法,构造方法,修饰符,包等信息,这些信息是用来相应类的实例对象表示,衙门是Field,Method,Contructor,Package等

一个类中的每一个成员都可以用相应的反射API类的一个实例对象来表示,通过调用Class来调用各种方法,我们接下来一个个讲

三.Constructor

代表的是某一个类的构造方法,我们用代码来看

public class CalssTest {public static void main(String[] args)throws NoSuchMethodException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {//得到String的StringBuffer构造方法Constructor<String> constructor = String.class.getConstructor(StringBuffer.class);String str = constructor.newInstance(new StringBuffer(“str”));System.out.println(str);}}

通过获得的方法用到上面相同类型的实例,再看newInstance,得到我们设置参数的构造方法,我们再来看下成员变量的反射

四.Field

这里我们就模拟了一个类,作为反射的对象

public class FieldClass {public int x;publicint y;public FieldClass(int x,int y) {this.x = x;this.y = y;}}

那我们实际的操作就是:

public class CalssTest {public static void main(String[] args){try {//首先为x,y 赋值FieldClass fClass = new FieldClass(10, 20);//反射成员变量Field field1 = fClass.getClass().getField(“x”);Field field2 = fClass.getClass().getField(“y”);//指定对象System.out.println(field1.get(fClass));System.out.println(field2.get(fClass));} catch (NoSuchFieldException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (SecurityException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

这样我们就可以直接反射到成员变量的值了,这里我们来做一个小练习来测试一下我们成员变量的反射的理解

练习题

假设我们有一个对象中,有许多的String类型成员变量,我们的需求就是把所有对应的字符串内容”b”改成”a”

题目有了我们整理下思路,首先要做的就是定义一个对象咯

public class FieldClass {public int x;public int y;public String str1 = “boy”;public String str2 = “bbq”;public String str3 = “hello”;public FieldClass(int x,int y) {this.x = x;this.y = y;}@Overridepublic String toString() {return “FieldClass [x=” + x + “, y=” + y + “, str1=” + str1 + “, str2=”+ str2 + “, str3=” + str3 + “]”;}} 如此锐气,二十后生有之,六旬男子则更多见。

JAVA进阶之旅(二)——认识Class类,反射的概念,Constructor,Field,Method,反射Main

相关文章:

你感兴趣的文章:

标签云: