反射是什么?
从.java->.class 编译
.class->.java 反编译(反射)编译一个javabean 反射的形式来实例化对象
利用反射来获取类的对象:
// 1 根据类名获取类的对象
Class<Person> p = Person.class;
// 2 根据对象来获取类的对象(获取class)
Person person = new Person();
System.out.println(person.getClass());
// 3 得到类的对象 com.entity.Person全限定名(全路径限定名)
Class c1 = Class.forName("com.entity.Person");
System.out.println(c1);
// 4
Class c2 = Person.class.getClassLoader().loadClass("com.entity.Person");
System.out.println(c2);
// 5 得到父类
Class c3 = Person.class.getSuperclass();
System.out.println(c3);
// 6 包装类
Class c4 = Integer.class;
System.out.println(c4);
根据类得到类名(全限定名):
// 得到你的类的对象
Class c = Class.forName("com.entity.Person");
// 输出类名
System.out.println(c.getName());
// 输出包
System.out.println(c.getSimpleName());
Field类(属性):
// 属性
// Field f1 = c.getField("pid"); 获取公共属性
// 获取属性(可以获取私有属性)
Field f1 = c.getDeclaredField("pid");
// 设置私有的属性能够被访问
f1.setAccessible(true);
// 得到名称
System.out.println(f1.getName());
// 得到访问修饰符
System.out.println(f1.getModifiers());
// 得到属性的数据类型
System.out.println(f1.getType());
// 得到一个person对象 newInstance 产生一个新的实例 实例化对象
Object person1 = c.newInstance();
// 赋值
f1.set(person1, "1");
// 取值
System.out.println(f1.get(person1));
Field f2 = c.getDeclaredField("pname");
// 设置私有的属性能够被访问
f2.setAccessible(true);
System.out.println(f2);
Object person2 = c.newInstance();
f2.set(person2, "张三");
System.out.println(f2.get(person2));
// 获取当前类对象中的所有的属性
Field[] fields = c.getDeclaredFields();
Object persons = null;
for (Field f : fields) {
f.setAccessible(true);
persons = c.newInstance();
if ("pid".contains(f.getName())) {
f.set(persons, "1");
} else if ("pname".contains(f.getName())) {
f.set(persons, "张三");
} else if ("psex".contains(f.getName())) {
f.set(persons, "男");
}
System.out.println(f.get(person));
}
Method类(方法):
// 无参无返回方法1
Class classs = Class.forName("com.entity.Person");
Method m1 = c1.getMethod("m1", null);
Object obj = c1.newInstance();
m1.invoke(obj, null);
// 无参有返回方法2
Method m2 = c1.getMethod("m2", null);
System.out.println(m2.invoke(obj, null));
// 有参无返回方法3
Method m3 = c1.getMethod("m3", String.class, String.class, String.class);
m3.invoke(obj, "1", "张三", "男");
// 有参有返回方法4
Method m4 = c1.getMethod("m4", String.class, String.class, String.class);
System.out.println(m4.invoke(obj, "1", "张三", "男"));
// 得到方法的参数类型
Class[] cl = m4.getParameterTypes();
for (Class cp : cl) {
System.out.println(cp.getSimpleName());
}
// 获取私有方法
// Method m4 = cc.getDeclaredMethod("m4", String.class, String.class,
// String.class);
// m4.setAccessible(true);
// System.out.println(m4.invoke(obj, "1", "张三", "男"));
构造方法:
// 无参
Class cc = Class.forName("com.entity.Person");
Constructor cto = c2.getConstructor(null);
System.out.println(cto);
// 有参
Constructor[] ctos = c2.getConstructors();
for (Constructor con : ctos) {
System.out.println(con);
}