Java之注解与反射 (2)

getMethod("方法名", 参数类型.class)获得指定的方法

//获得本类和继承类的所有public方法 Method[] methods = c1.getMethods(); for (Method method : methods ) { System.out.println("getMethods(): " + method); } //获取本类的所有方法 methods = c1.getDeclaredMethods(); for (Method method : methods ) { System.out.println("getDeclaredMethods(): " + method); } //获得指定的方法 Method setName = c1.getMethod("setName", String.class); Method getName = c1.getMethod("getName"); System.out.println(setName); System.out.println(getName); Constructor() //获取所有的构造器 Constructor[] constructors = c1.getConstructors(); //获取本类和父类的所有构造方法 for (Constructor constructor : constructors ) { System.out.println(constructor); } System.out.println("====================================="); constructors = c1.getDeclaredConstructors(); //获取本类所有构造方法 for (Constructor constructor : constructors) { System.out.println(constructor); } System.out.println("====================================="); //获取指定的构造器 Constructor constructor = c1.getConstructor(String.class, int.class, int.class); System.out.println(constructor); 反射类构造器获得实例化对象

反射获得User类的class对象Class.forName()

调用有参或无参构造方法实例化对象class.newInstance()

public static void main(String[] args) throws Exception{ //反射获得User类的class对象 Class c1 = Class.forName("com.reflaction.User"); User user = (User) c1.newInstance(); //调用无参构造实例化对象 System.out.println(user); //获得有参构造方法 Constructor constructor = c1.getDeclaredConstructor(String.class, int.class, int.class); //通过构造器获得实例话对象 User ago = (User) constructor.newInstance("ago", 18, 1); //有参构造获得实例化对象 System.out.println(ago); } User{name='null', age=0, id=0} User{name='ago', age=18, id=1} 反射获取调用普通方法

方式1: 反射获取目标类的class对象(Class.forName()) ==> 获取有参构造器(class.getDeclaredConstructor()) ==> 获取目标类实例化对象(constructor1.newInstance(param1, param2, param3 ,...)) ==> 调用方法(实例化对象.Method())

Class c2 = Class.forName("com.reflaction.User"); Constructor constructor1 = c2.getDeclaredConstructor(String.class, int.class, int.class); User zh1z3ven = (User) constructor1.newInstance("zh1z3ven", 20, 2); System.out.println(zh1z3ven.getAge()); System.out.println(zh1z3ven.getName()); zh1z3ven.setId(20); System.out.println(zh1z3ven.getId());

方式2: 反射获取目标类class对象(Class.forName()) ==> 获取指定方法(class.getMethod("方法名", 参数)) ==> 激活执行方法(.invoke(目标对象, 参数))

Class c2 = Class.forName("com.reflaction.User"); User user2 = (User) c2.newInstance(); Method setName = c2.getMethod("setName", String.class); setName.invoke(user2, "kfei"); System.out.println(user2.getName()); 反射操作属性

获取class对象

class.getDeclaredField("属性名") 获取属性

.set() 方法设置属性

若为private修饰,出现无权限操作异常,可用.setAccessible(true) 关闭安全检测,获取操作权限

Class c3 = Class.forName("com.reflaction.User"); User user4 = (User) c3.newInstance(); Field name = c3.getDeclaredField("name"); name.setAccessible(true); name.set(user4 ,"zgo"); System.out.println(user4.getName()); Invoke(Object obj, Obj... args)

Object对应原方法返回值,若无返回值,返回null

若原方法为静态方法,形参Object obj可为null

若原方法形参列表为空,Obj... args可为null

若原方法声明为private,在调用invoke()前,显示调用方法对象的.setAccessible(true)方法,关闭安全检测,获取访问权限

反射调用Runtime() import org.apache.commons.io.IOUtils; import java.io.InputStream; import java.lang.reflect.Constructor; import java.lang.reflect.Method; public class RuntimeExecDemo { public static void main(String[] args) throws Exception{ String command = "ifconfig"; Class c = Class.forName("java.lang.Runtime"); //获取Runtime类的class对象 Constructor constructor = c.getDeclaredConstructor(); //获取构造器 constructor.setAccessible(true); //关闭安全检测,暴力反射 Object runtime = constructor.newInstance(); //构造runtime对象 Method exec = c.getMethod("exec", String.class); //获取exec方法 Process process = (Process) exec.invoke(runtime, command); //激活执行exec //获取命令回显结果 InputStream inputStream = process.getInputStream(); //获取process输入流中输出的数据 String ifconfig = IOUtils.toString(inputStream, "GBK"); //字节流转字符流 System.out.println(ifconfig); //打印结果 } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgwdpz.html