反射---最大的应用:反射配置文件中的类路径,动态创建对象,增强扩展性,灵活性
反射:一般被反射的类,都需要一个默认的构造函数,即无参构造函数不要被覆盖了!
反射构造函数
反射类的字段
反射类的方法
package com.gc.reflect;
public class Person {
private String name;
private int age;
public static String country = "CN";
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person() {
super();
}
private void privateMethod(String param) {
System.out.println("Person.privateMethod():"+name+"---"+param);
}
public void show() {
System.out.println("Person.show():"+this.name);
}
public static void staticMethod() {
System.out.println("Person.staticMethod():"+country);
}
}
package com.gc.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Reflect {
public static void main(String[] args)throws Exception {
//getObjectClass();
//newObjectInstance();
//getConstructors();
//getObjectFields();
getObjectMethods();
}
/**
* 获取字节码文件对象
* @throws ClassNotFoundException
*/
public static void getObjectClass() throws ClassNotFoundException {
Class clazz1 = Person.class;
Class clazz2 = new Person().getClass();
Class clazz3 = Class.forName("com.gc.reflect.Person");//服务器:读取配置文件---反射---接口---多态
System.out.println(clazz1==clazz2);
System.out.println(clazz1==clazz3);
}
/**
* 无参构造函数创建对象
* @throws Exception
*/
public static void newObjectInstance() throws Exception {
//加载字符串所指的类,并编译为字节码,得到Class对象
Class clazz = Class.forName("com.gc.reflect.Person");
//调用类的无参构造函数,创建对象
Object object = clazz.newInstance();
}
/**
* 获取带参数的构造方法,并通过这个构造函数创建对象
*/
public static void getConstructors() throws Exception {
Class clazz = Class.forName("com.gc.reflect.Person");
//获取带参数的构造方法
Constructor cons = clazz.getConstructor(String.class,int.class);
//传入产生,创建对象
Object obj = cons.newInstance("zs",20);
}
/**
* 获取类中的字段
* clazz.getFields();//本类和父类中所有的共有成员
* clazz.getDeclaredFields();//只获取本类,包括私有成员
*/
public static void getObjectFields() throws Exception {
Class clazz = Class.forName("com.gc.reflect.Person");
Field field = clazz.getDeclaredField("name");
if(!field.isAccessible()) {
field.setAccessible(true);
}
Object obj = clazz.newInstance();
//为字段设置值
field.set(obj, "xiaoqiang");
//获取字段的值
Object name = field.get(obj);
System.out.println(name);
}
/**
* 调用类中的方法
*/
public static void getObjectMethods() throws Exception {
Class clazz = Class.forName("com.gc.reflect.Person");
Constructor cons = clazz.getConstructor(String.class, int.class);//注意:int.class != Integer.class
Object obj = cons.newInstance("beabai",26);
Method[] methods = clazz.getDeclaredMethods();
for(Method m : methods) {
if(!m.isAccessible())
m.setAccessible(true);
if("privateMethod".equals(m.getName()))
m.invoke(obj, "hello");
else
m.invoke(obj, (Object[])null);
}
}
}