反射实例2

来源:互联网 发布:python微信开发框架 编辑:程序博客网 时间:2024/05/29 18:28
package com.hsj;import java.lang.reflect.Method;import org.junit.Test;/** * 说明:学生类继承Person类 如果学生类复写了eat方法,则调用学生类的eat方法 利用反射获取Person的受保护的方法 eat方法 * 知识点:利用Class对象的相关方法获取父类受保护的方法 *  */public class ExtendsReflect {@Testpublic void test() {try {/** * 使用class.forName()获取字节码对象 等同于 Strudent.class(),student.getClass() * student 是Student 的实例对象 */Class clazz = Class.forName("com.hsj.domain.Student");Method method = null;while (true) {try {// 获取eat方法,如果获取到了,我们就结束循环,否则,递归调用父类的字节码对象的相应方法,如果字节码对象是Object,退出循环method = clazz.getDeclaredMethod("eat", null);break;} catch (NoSuchMethodException e) {if (clazz == Object.class){System.out.println("没有对应的方法");break;}/** * 这段代码是用来获取父类的字节码对象  */clazz = clazz.getSuperclass();}}/** * 如果找到了相应的方法 */if (method != null) {if(!method.isAccessible()){method.setAccessible(true);}method.invoke(clazz.newInstance(), null);}} catch (Exception e) {e.printStackTrace();}}}




package com.hsj.domain;public class Student extends Person {public void learn(){System.out.println("学生的学习方法");}@Overrideprotected void eat() {System.out.println("重写过的eat方法");}}



package com.hsj.domain;public class Person {private String username;private String password;public Person(String username, String password) {super();this.username = username;this.password = password;}public Person() {super();}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public static void main(String[] args) {if(args!=null){for(String s :args){System.out.println(s);}}System.out.println("反射main函数测试");}public void test1(char[] chars){System.out.println("test1 char[]");}public void test2(Integer[] ints){System.out.println("test2...");}public void test3(String s1,String s2){System.out.println("test3");}@Overridepublic String toString() {return this.username+":"+this.password;}protected void eat(){System.out.println("受保护的方法 eat....");}