java基础之反射实现

首先要理解一个词–“动态语言”。动态语言是指程序在运行的时候可以动态的改变类的属性以及方法,也就是程序运行之前所写的类完全可删除、添加、修改其属性和方法。

通过java 中的api 我们可以去获取一个类的属性、方法、包名,所以可以认为java是准动态的语言,在一些框架里面反射是常用一个手段。而C++就不支持这种功能。

通过三种反射的方法可以new一个新的对象

下面是一个Java类:

package com.lubby.test;public class Student {private int id;private String name;public Student() {super();}public Student(int id, String name) {super();this.id = id;this.name = name;}public void print() {System.out.println("aaaaaaaa");}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}

这里是main方法

public static void main(String[] args) throws SecurityException,NoSuchMethodException {try {Student stu1 = (Student) Class.forName("com.lubby.test.Student").newInstance();Student stu2 = Student.class.newInstance();Student stu3 = new Student().getClass().newInstance();} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}

通过 Class.forName("com.lubby") 、Student.class获取class对象,然后通过newInstance()方法就可以new出一个对象了;

获取到Class对象之后我们就可以做一些事情,譬如获取类的成员变量、方法、构造函数等等。

public static void main(String[] args) throws SecurityException,NoSuchMethodException {try {Class<?> c1 = Class.forName("com.lubby.test.Student");// c1.getName()可以获得类名System.out.println(c1.getName());System.out.println("----------我是分割线----------");// c1.getMethods可以获得类的方法Method methods[] = c1.getMethods();for (Method m : methods) {System.out.println(m.getName());}System.out.println("----------我是分割线----------");// c1.getDeclaredConstructors()可以获得所有的构造函数Constructor<?> ctors[] = c1.getDeclaredConstructors();for (Constructor c : ctors) {System.out.println(c.getName());}System.out.println("----------我是分割线----------");// c1.getFields()可以获取所有的变量Field fields[] = c1.getDeclaredFields();for (Field f : fields) {System.out.println(f.getName());}} catch (ClassNotFoundException e) {e.printStackTrace();}

最后输出结果:

com.lubby.test.Student———-我是分割线———-setIdgetNamegetIdsetNameprintwaitwaitwaithashCodegetClassequalstoStringnotifynotifyAll———-我是分割线———-com.lubby.test.Studentcom.lubby.test.Student———-我是分割线———-idname

目前就这些常用的,其他的遇到在添加上去。

没有行李,没有背包,不带电脑更不要手机,

java基础之反射实现

相关文章:

你感兴趣的文章:

标签云: