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 这个类是没有对应的类装载器的?
有兴趣的同志可以探讨一下,迟些我也会聊聊类装载器这个知识点。
- Java反射之Constructor(一)
- Java反射(二)Constructor
- Java反射之Class,Constructor,Field
- 反射之Constructor
- Java(反射Filed和Constructor类)
- Java反射机制:Constructor!
- java反射之使用Constructor调用私有构造函数
- 非深入探寻Java反射机制 (Constructor)
- JAVA进阶之旅(二)——认识Class类,反射的概念,Constructor,Field,Method,反射Main方法,数组的反射和实践
- java 之反射笔记(一)
- Java反射之Method(一)
- Java反射之Field(一)
- Java反射之应用(一)
- java基础巩固之反射(一)
- JAVA 反射 总结 之 初级 (一)
- Java回炉之反射(一)
- java之反射技术(一)
- Java高级开发之反射(一)
- 利用dbms_metadata.get_ddl查看DDL语句(原创)
- 简单的UDP循环服务器:时间服务器
- Harris角点检测
- Linux API -- open 设置操作属性O_APPEND时的那点小事
- hdu 1224 最长路
- Java反射之Constructor(一)
- 树状数组总结
- hibernate之HQL实体更新与删除
- 大规模超文本网络搜索引擎解析 [ The Anatomy of a Large-Scale Hypertextual Web Search Engine ]
- windows迁移linux,在文件上遇到的问题
- 华为上机笔试之通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
- 求m-n之间的所有素数
- c# 可空数据类型
- java带静态块和非静态块的初始化顺序