java基础之反射

xiaoxiao2021-04-18  108

一、三种创建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

如有错误恳请各位大佬批评指教!!!

 

转载请注明原文地址: https://www.6miu.com/read-4820340.html

最新回复(0)