Java反射之Constructor(一)

来源:互联网 发布:js获取元素css样式 编辑:程序博客网 时间:2024/05/22 16:25

什么是反射?要弄清楚反射,我们必须弄清楚什么是字节码,什么是类装载器。我们知道,Java是一个完全面向对象的语言,

那么我们写好的 .java 文件经过编译后生成的 .class  ,对Java虚拟机来说,是不是应该也是一个对象呢?在Java中,的确是将

.class 看做一类对象,既然是一类对象,这些对象有哪些共性(共同的属性和方法),是不是需要用一个Java类封装起来呢?

是的。在Java中使用了 Class 这个Java类去封装 .class 这一类对象(要注意Class 与 java中定义一个类的关键字 class 区分开来)。

明白了这一点,我们是不是应该想想 Class 这个Java类会封装一些什么信息呢?这样一问,我们是不是应该去问  .class 这一类对象

有哪些共性呢?我们平时定义一个普通Java类是不是有构造方法,成员变量(字段属性),成员方法等等共有的信息啊。由此,我们可以

知道 Class 这个Java会封装方法,字段,构造方法等等共有特性。

总的来说,反射就是把我们写的普通Java类中的各种成分映射成对应的Java类。如普通的Java类都有方法,构造方法和字段等成分,那么

Java中就会有Method,Constructor以及Field 和这些成分一一对应。

那么,什么是类装载器呢?简单的说,就有把 .class 加载到内存中的一个Java类。Java中好有些类装载器类,Java虚拟就可以实例化这些类装载器,

让这些类装载器为虚拟机工作。既然是有类装载器控制加载 .class 的,那么我们是不是可以想,如果我们需要知道 .class 的一些信息,是不是问问类装载器

就可以获取了呢!的确也是如此!


下面,就让我们开始反射技术之旅吧!!!enjoy!!!


下面通过反射技术实例化一个类:


这是一个实体bean

package three.day.reflect;


public class Teacher {
private String name;
public Integer age;

public Teacher(){
System.out.println("empty constructor invoked");
}

public Teacher(String name,Integer age){
this.name = name;
this.age = age;
System.out.println("Str Int constructor invoked" + " , " +
"name = " + this.name + " , age = " + this.age);
}


public String getName() {
return name;
}


public void setName(String name) {
this.name = name;
}


public Integer getAge() {
return age;
}


public void setAge(Integer age) {
this.age = age;
}


@Override
public String toString() {
return "Teacher [name=" + name + ", age=" + age + "]";
}


}


我们通过反射实例化这个bean类:


package three.day.reflect;


import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;


public class ReflectPerson {


public static void main(String[] args) 
throws ClassNotFoundException, SecurityException, NoSuchMethodException, 
IllegalArgumentException, InstantiationException, IllegalAccessException, 
InvocationTargetException {
ClassLoader classLoader = ReflectPerson.class.getClassLoader();
System.out.println("1 classLoader = " + classLoader);
classLoader = Class.class.getClassLoader();
System.out.println("2 classLoader = " + classLoader);
classLoader = new ReflectPerson().getClass().getClassLoader();
System.out.println("3 classLoader = " + classLoader);
Class clazz = classLoader.loadClass("three.day.reflect.Teacher");
System.out.println("4 clazz = " + clazz);
clazz = Class.forName("three.day.reflect.Teacher");
System.out.println("5 clazz = " + clazz);

Constructor[] constructors = clazz.getConstructors();
int i = 6;
for(Constructor c : constructors){
System.out.println(i + " " + c);
i++;
}

Constructor cttEmpty = clazz.getConstructor(new Class[]{});
Object objEmpty = cttEmpty.newInstance(new Object[]{});

Constructor cttParamsStrInt = clazz.getConstructor(new Class[]{String.class,Integer.class});
Object objPramsStrint = cttParamsStrInt.newInstance(new Object[]{"lihuiming",45});
}


}


程序运行效果:

1 classLoader = sun.misc.Launcher$AppClassLoader@1372a1a
2 classLoader = null
3 classLoader = sun.misc.Launcher$AppClassLoader@1372a1a
4 clazz = class three.day.reflect.Teacher
5 clazz = class three.day.reflect.Teacher
6 public three.day.reflect.Teacher()
7 public three.day.reflect.Teacher(java.lang.String,java.lang.Integer)
empty constructor invoked
8 objEmpty = Teacher [name=null, age=null]
Str Int constructor invoked , name = lihuiming , age = 45
9 objPramsStrint = Teacher [name=lihuiming, age=45]


通过观察结果:

我们知道,的确已经实例化了bean,但是

我们是不是该问下 Class 这个类是没有对应的类装载器的?

有兴趣的同志可以探讨一下,迟些我也会聊聊类装载器这个知识点。







原创粉丝点击