一、三种创建Class文件对象的方法
public class ClassDemo1 {
//本类主要写了三种创建Class文件对象的方法
@SuppressWarnings("rawtypes")
public static void main(String[] args) throws ClassNotFoundException {
//获取一个类的Class文件对象的三种方式
// 方法1:通过对象获取
Person p = new Person();
Class c1 = p.getClass();
System.out.println(c1);
//方法2:通过类名获取
Class<Person> c2 = Person.class;
System.out.println(c2);
//方法3:通过Class类的静态方法forname获取
Class c3 = Class.forName("cn.ckhd.demo1.Person");
System.out.println(c3);
//以上创建出的三个Class文件对象都是相当的,因为Class文件对象时唯一的
System.out.println(c1.equals(c2));
System.out.println(c1.equals(c3));
System.out.println(c2.equals(c3));
System.out.println(c1==c2);
System.out.println(c1==c3);
System.out.println(c2==c3);
}
其中Person类的代码如下:
public class Person {
public String name;
private String sex;
public int age;
public Person() {
super();
// TODO Auto-generated constructor stub
}
public Person(String name, String sex) {
super();
this.name = name;
this.sex = sex;
}
@SuppressWarnings("unused")
private Person(String name,String sex,int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public void eat() {
System.out.println("人在吃饭!!!");
}
public void eat(String name) {
System.out.println(name+"在吃饭");
}
@SuppressWarnings("unused")
private void eat(String name,String sex) {
System.out.println(name+"在吃饭!!"+"性别是:"+sex);
}
@Override
public String toString() {
return "Person [name=" + name + ", sex=" + sex + ", age=" + age + "]";
}
}
二:反射获取构造方法
public class ConstructorDemo {
//反射获取构造方法
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void main(String[] args) throws Exception {
//获取Person类的Class文件对象
Class c = Class.forName("cn.ckhd.demo1.Person");
// 获取Person类的全部的 public 构造器
Constructor[] con = c.getConstructors();
for (Constructor constructor : con) {
System.out.println(constructor);
}
//获取有两个参数的构造方法
Constructor co = c.getConstructor(String.class, String.class);
Object obj = co.newInstance("张三", "男");
System.out.println(obj);
//获取空参数的构造方法
Constructor cs = c.getConstructor();
Object ok = cs.newInstance();
System.out.println(ok);
//获取构造方法的快捷方式
//使用前提:被反射的类必须有空参数的构造方法 构造方法权限必须是public (同号里面可以写默认权限)
Object okk = c.newInstance();
System.out.println(okk);
//以下为暴力反射部分,不推荐使用,破坏了程序的封装性和安全性
//暴力反射获取Person类的所有的构造方法,包括私有的
Constructor[] bcon = c.getDeclaredConstructors();
for (Constructor constructor : bcon) {
System.out.println(constructor);
}
//暴力反射获取Person类的私有的构造方法
Constructor bco = c.getDeclaredConstructor(String.class,String.class,int.class);
//必须使用setAccessible()方法设置为true,取消java语言访问检查
bco.setAccessible(true);
Object obco = bco.newInstance("张三","人妖",52);
System.out.println(obco);
}
}
三:反射获取成员变量
public class FieldDemo {
//反射获取成员变量
@SuppressWarnings("rawtypes")
public static void main(String[] args) throws Exception {
Class c = Class.forName("cn.ckhd.demo1.Person");
Object obj = c.newInstance();
//获取Person类所有的public的成员变量
Field[] fall = c.getFields();
for (Field field2 : fall) {
System.out.println(field2);
}
//获取Person类中的单独的 一个 成员变量,并调用Field里面的set方法设置其值
Field fsome = c.getField("name");
fsome.set(obj, "张三");
System.out.println(obj);
//暴力反射
//获取Person类的全部的成员变量,包括私有的
Field[] bfall = c.getDeclaredFields();
for (Field field : bfall) {
System.out.println(field);
}
//暴力反射,获取Person类的一个私有的成员变量并设置其值
Field bfsome = c.getDeclaredField("sex");
//反射的对象使用时取消java语言访问性检查
bfsome.setAccessible(true);
bfsome.set(obj, "男");
System.out.println(obj);
}
}
四:反射获取成员方法
public class MethodDemo {
//反射获取成员方法
@SuppressWarnings("unchecked")
public static void main(String[] args) throws Exception {
@SuppressWarnings("rawtypes")
Class c = Class.forName("cn.ckhd.demo1.Person");
Object obj = c.newInstance();
//反射获取Person类所有的 public 方法,包括继承的方法,不包括构造方法
Method[] method = c.getMethods();
for (Method method2 : method) {
System.out.println(method2);
}
//反射获取某个成员方法并运行
Method m1 = c.getMethod("eat", String.class);
m1.invoke(obj, "李四");
//暴力反射
//暴力反射获取Person全部的方法,包括私有的,其中继承的方法很构造方法不会获取到
Method[] bmethod = c.getDeclaredMethods();
for (Method method2 : bmethod) {
System.out.println(method2);
}
//暴力反射获取Person类的私有的方法并运行
Method bm1 = c.getDeclaredMethod("eat", String.class,String.class);
bm1.setAccessible(true);
bm1.invoke(obj, "王五","未知");
}
}
五:通过配置文件获取需要反射的对象
public class ConfigurationFile {
@SuppressWarnings("rawtypes")
public static void main(String[] args) throws Exception {
FileReader fr = new FileReader("config.properties");
Properties pp = new Properties();
pp.load(fr);
String className = pp.getProperty("className");
String methodName = pp.getProperty("methodName");
Class c = Class.forName(className);
@SuppressWarnings("unchecked")
Method m1 = c.getMethod(methodName);
m1.invoke(c.newInstance());
}
}
配置文件书写如下
#className=cn.ckhd.demo5.Student
#methodName=study
className=cn.ckhd.demo5.Worker
methodName=work
如有错误恳请各位大佬批评指教!!!