反射的初步:
动态语言: 程序运行时,可以改变程序结构或变量类型,如:Python,ruby,javascript等等。
package com.bjsxt.test.bean; public class User { private int id; private int age; private String uname; public int getId() { return id; } public void setId(int id) { this.id = id; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getUname() { return uname; } public void setUname(String uname) { this.uname = uname; } public void setUname() { this.uname = "高淇"; } public User(int id, int age, String uname) { super(); this.id = id; this.age = age; this.uname = uname; } //javabean必须要有无参的构造方法! public User() { } }
package com.bjsxt.test; /** * 测试各种类型(class,interface,enum,annotation,primitive type,void)对应的java.lang.Class对象的获取方式 * @author 尚学堂高淇 www.sxt.cn * */ @SuppressWarnings("all") public class Demo01 { public static void main(String[] args) { String path = "com.bjsxt.test.bean.User"; try { Class clazz = Class.forName(path); //对象是表示或封装一些数据。 一个类被加载后,JVM会创建一个对应该类的Class对象,类的整个结构信息会放到对应的Class对象中。 //这个Class对象就像一面镜子一样,通过这面镜子我可以看到对应类的全部信息。 System.out.println(clazz.hashCode()); Class clazz2 = Class.forName(path); //一个类只对应一个Class对象 System.out.println(clazz2.hashCode()); Class strClazz = String.class; Class strClazz2 = path.getClass(); System.out.println(strClazz==strClazz2); Class intClazz =int.class; int[] arr01 = new int[10]; int[][] arr02 = new int[30][3]; int[] arr03 = new int[30]; double[] arr04 = new double[10]; System.out.println(arr01.getClass().hashCode()); System.out.println(arr02.getClass().hashCode()); System.out.println(arr03.getClass().hashCode()); System.out.println(arr04.getClass().hashCode()); } catch (Exception e) { e.printStackTrace(); } } }
程序的运行结果是:
true
319454176
357218532
319454176
1555073959
一般来说反射是这样实现的:
Class class = Class.forName(className);
Object object= class.newInstance();
所以需要一个无参的构造器来生成对象(因为没有给初始值)。所以在上面定义了:
//javabean必须要有无参的构造方法! public User() { }