反射机制,程序在运行时加载新的类,使程序更加灵活
public classHelooReflect {public static voidmain(String[] args) {//获取类
testClass();
}private static voidtestClass() {//创建一个学生类的对象
Student student = newStudent();try{//开始获取类
Class clazz1 = Student.class;
Class clazz2=student.getClass();
Class clazz3= Class.forName("com.bjsxt.java.clc.fanshe.Student");//判断类对象是否相等
System.out.println(clazz1 ==clazz2);
System.out.println(clazz1==clazz3);//常见 方法
System.out.println("类的名字" +clazz1.getName());
System.out.println("类的简称" +clazz1.getSimpleName());
System.out.println("包的信息" +clazz1.getPackage().getName());
System.out.println("获取包名" +clazz1.getPackage());
System.out.println("获取修饰符" +clazz1.getModifiers());
System.out.println("获取父类" +clazz1.getSuperclass());
System.out.println("获取父类的超类" +clazz1.getGenericSuperclass());
System.out.println("判断是否为接口" +clazz1.isInterface());
System.out.println("获取类加载器" +clazz1.getClassLoader());//基本类型9=(8种基本数据类型的类+1void)
System.out.println(int.class == Integer.class);//不等//判断是否是基本类型
System.out.println(int.class.isPrimitive());
System.out.println(Integer.class.isPrimitive());
System.out.println("数组是引用类型" + int[].class.isPrimitive());
}catch(ClassNotFoundException e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
获取类的名字,方法,属性,构造器
importjava.lang.reflect.Constructor;importjava.lang.reflect.Field;importjava.lang.reflect.Method;public classTest2 {public static voidmain(String[] args) {try{
Class clazz= Class.forName("bean.User");//获取类的名字
clazz.getName();/*** 获取属性信息*/
//只能获取public的属性
Field[] fields1 =clazz.getFields();//可以获得所有的属性
Field[] fields2 =clazz.getDeclaredFields();//输出获取到的属性的个数
System.out.println(fields1.length);
System.out.println(fields2.length);//遍历获取到的属性
for(Field field : fields2) {
System.out.println("属性" +field);
}//获得属性的权限
Field f = clazz.getDeclaredField("uname");
System.out.println(f);/*** 获取方法的信息*/Method[] methods=clazz.getDeclaredMethods();
Method m01= clazz.getDeclaredMethod("getUname", null);//如果方法有参,则必须传递参数类型对应的class对象
Method m02 = clazz.getDeclaredMethod("setUname", String.class);for(Method method : methods) {
System.out.println("方法" +method);
}/***获取构造器信息*/Constructor[] constructors=clazz.getDeclaredConstructors();
Constructor c= clazz.getDeclaredConstructor(int.class,int.class,String.class);
System.out.println("获得构造器"+c);for(Constructor constructor : constructors) {
System.out.println("构造器"+constructor);
}
}catch(ClassNotFoundException e) {//TODO Auto-generated catch block
e.printStackTrace();
}catch(NoSuchFieldException e) {//TODO Auto-generated catch block
e.printStackTrace();
}catch(SecurityException e) {//TODO Auto-generated catch block
e.printStackTrace();
}catch(NoSuchMethodException e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
通过反射操作类的属性,方法构造器
importjava.lang.reflect.Constructor;importjava.lang.reflect.Field;importjava.lang.reflect.InvocationTargetException;importjava.lang.reflect.Method;importbean.User;/***@authorclc
**/
public classTest3 {public static voidmain(String[] args) {try{
Class clazz = (Class) Class.forName("bean.User");//通过反射API调用构造方法,构造对象//其实调用了User的无参构造方法
User u1 =clazz.newInstance();
System.out.println(u1);//有参调用构造器
Constructor c = clazz.getDeclaredConstructor(int.class, int.class, String.class);
User u2= c.newInstance(1234, 22, "clc");
System.out.println(u2);//通过反射调用普通方法
User u3 =clazz.newInstance();
Method method= clazz.getDeclaredMethod("setUname", String.class);//相当于u3.setUname("clc3");
method.invoke(u3, "clc3");
System.out.println(u3);//通过反射操作属性
User u4 =clazz.newInstance();
Field f= clazz.getDeclaredField("uname");//设置属性不需要安全检查,可以直接访问
f.setAccessible(true);//通过反射直接设置属性
f.set(u4, "clc4");//通过反射直接读取属性值
System.out.println(u4.getUname());
System.out.println(f.get(u4));
}catch(ClassNotFoundException e) {//TODO Auto-generated catch block
e.printStackTrace();
}catch(InstantiationException e) {//TODO Auto-generated catch block
e.printStackTrace();
}catch(IllegalAccessException e) {//TODO Auto-generated catch block
e.printStackTrace();
}catch(NoSuchMethodException e) {//TODO Auto-generated catch block
e.printStackTrace();
}catch(SecurityException e) {//TODO Auto-generated catch block
e.printStackTrace();
}catch(IllegalArgumentException e) {//TODO Auto-generated catch block
e.printStackTrace();
}catch(InvocationTargetException e) {//TODO Auto-generated catch block
e.printStackTrace();
}catch(NoSuchFieldException e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
辅助类User
packagebean;public classUser {private intid;private intage;privateString uname;
@OverridepublicString toString() {return "User [id=" + id + ", age=" + age + ", uname=" + uname + "]";
}
@Overridepublic inthashCode() {final int prime = 31;int result = 1;
result= prime * result +age;
result= prime * result +id;
result= prime * result + ((uname == null) ? 0: uname.hashCode());returnresult;
}
@Overridepublic booleanequals(Object obj) {if (this ==obj)return true;if (obj == null)return false;if (getClass() !=obj.getClass())return false;
User other=(User) obj;if (age !=other.age)return false;if (id !=other.id)return false;if (uname == null) {if (other.uname != null)return false;
}else if (!uname.equals(other.uname))return false;return true;
}public intgetId() {returnid;
}public void setId(intid) {this.id =id;
}public intgetAge() {returnage;
}public void setAge(intage) {this.age =age;
}publicString getUname() {returnuname;
}public voidsetUname(String uname) {this.uname =uname;
}public User(int id, intage, String uname) {super();this.id =id;this.age =age;this.uname =uname;
}publicUser() {super();
}
}
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import bean.User;
/**
*@authorclc
*
*/
public class Test3 {
public static void main(String[] args) {
try {
Class clazz = (Class) Class.forName("bean.User");
// 通过反射API调用构造方法,构造对象
// 其实调用了User的无参构造方法
User u1 = clazz.newInstance();
System.out.println(u1);
// 有参调用构造器
Constructor c = clazz.getDeclaredConstructor(int.class, int.class, String.class);
User u2 = c.newInstance(1234, 22, "clc");
System.out.println(u2);
// 通过反射调用普通方法
User u3 = clazz.newInstance();
Method method = clazz.getDeclaredMethod("setUname", String.class);
// 相当于u3.setUname("clc3");
method.invoke(u3, "clc3");
System.out.println(u3);
// 通过反射操作属性
User u4 = clazz.newInstance();
Field f = clazz.getDeclaredField("uname");
// 设置属性不需要安全检查,可以直接访问
f.setAccessible(true);
// 通过反射直接设置属性
f.set(u4, "clc4");
// 通过反射直接读取属性值
System.out.println(u4.getUname());
System.out.println(f.get(u4));
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}