Java基础39-通过反射机制获取类的方法、属性和构造方法
2019-04-01 15:08
399 查看
1.获取方法
通过Class类的getMethods()方法、getDeclaredMethods()方法、getMethod(String name,Class[] args)方法和getDeclaredMethod(String name,Class[] args)等方法,程序员可以获得对应类的特定方法组合方法,返回值为Method对象数组或Method对象。
接下来在上面案例基础上,说明Class类的getDeclaredMethod()方法和getMethods()方法的区别。
创建Person 类
[code]class person{ private float height; private float weight; void getPersonName() { } public void getPersonHeight() { } private void getPersonWeight() { } protected void getPersonColor() { } }
创建Person子类
[code]class student extends person { private String name; private int age; public student() { super(); } void getStudentHeight() { } public void getStudentName() { } private void getStudentAge() { } protected void getStudentColor() { } }
测试
[code]public class reflect { public static void main(String[] args) { try { Class classzz = Class.forName("student"); System.out.println("classzz = " + classzz); //getMethods方法 Method[] methods = classzz.getMethods(); System.out.println(" ----getMethods: "); for(Method m : methods) { System.out.println(m); } //getDeclaredMethods 方法 Method[] declaredMethods = classzz.getDeclaredMethods(); System.out.println("\r\n ----declaredMethods: "); for(Method m : declaredMethods) { System.out.println(m); } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
输出
[code]classzz = class student ----getMethods: public void student.getStudentName() public void person.getPersonHeight() public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException public final void java.lang.Object.wait() throws java.lang.InterruptedException public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException public boolean java.lang.Object.equals(java.lang.Object) public java.lang.String java.lang.Object.toString() public native int java.lang.Object.hashCode() public final native java.lang.Class java.lang.Object.getClass() public final native void java.lang.Object.notify() public final native void java.lang.Object.notifyAll() ----declaredMethods: void student.getStudentHeight() public void student.getStudentName() private void student.getStudentAge() protected void student.getStudentColor()
总结
从以上测试结果可以看出,declaredMethods只能获取当前类的方法(包访问权限+public + private + protcted).
getMethods可以获取本身类和其**所有父类的所有共有方法(public)**.
2.获取属性、获取构造方法
[code]package cn.lanqiao01; import java.lang.reflect.Field; import java.lang.reflect.Method; public class Test { private int age; private String name; public Test(int age, String name) { super(); this.age = age; this.name = name; } public Test() {} public int getAge() { return age; } public String getName() { return name; } public void setAge(int age) { this.age = age; } public void setName(String name) { this.name = name; } public static void main(String[] args) throws Exception{ Class<?> class1 = Class.forName("cn.lanqiao01.Test"); Field[] fields = class1.getDeclaredFields(); Method[] methods = class1.getDeclaredMethods(); //得到类本身的所有方法 for(Field f:fields){ System.out.println("---------------------------属性"+f); } System.out.println("------------------分割线--------------------"); for(Method m:methods){ System.out.println("---------------------------方法"+m); } //调用无参方法 //得到Student1类的方法,第一个参数到最后一个参数都是方法对应的参数类型 Method method = class1.getMethod("reflect1"); //调用方法(第一个参数为对象,第二个参数到最后一个参数为方法属性值) method.invoke(class1.newInstance()); //调用有参数的方法 //得到某个类的方法 Method m2 = class1.getMethod("learn",String.class,String.class); //调用方法(第一个参数为对象,第二个参数到最后一个参数为方法属性值) m2.invoke(class1.newInstance(),"张三","商务英语"); } public void learn(String name,String bookname) { System.out.println(name+"学习了"+bookname); } public void reflect1() { System.out.println("-----------------调用了这个方法-----------"); } }
结果:
[code]---------------------------属性private int cn.lanqiao01.Test.age ---------------------------属性private java.lang.String cn.lanqiao01.Test.name ------------------分割线-------------------- ---------------------------方法public static void cn.lanqiao01.Test.main(java.lang.String[]) throws java.lang.Exception ---------------------------方法public java.lang.String cn.lanqiao01.Test.getName() ---------------------------方法public void cn.lanqiao01.Test.setName(java.lang.String) ---------------------------方法public void cn.lanqiao01.Test.setAge(int) ---------------------------方法public void cn.lanqiao01.Test.reflect1() ---------------------------方法public void cn.lanqiao01.Test.learn(java.lang.String,java.lang.String) ---------------------------方法public int cn.lanqiao01.Test.getAge() -----------------调用了这个方法----------- 张三学习了商务英语
相关文章推荐
- java中的反射机制,以及如何通过反射获取一个类的构造方法 ,成员变量,方法,详细。。
- JAVA反射获取类名,方法名,属性及构造方法
- java 利用反射机制,获取实体所有属性和方法,并对属性赋值
- java通过反射机制获取对象属性和值
- Java通过反射机制动态设置对象属性值的方法
- 黑马程序员--Java基础加强--16.利用反射操作泛型V【通过Constructor反射解析泛型构造方法】【通过Field反射解析泛型成员变量】【个人总结】
- [java]反射机制给属性使用set方法构造对象
- java 反射机制(通过getGenericSuperclass()方法获取到父类泛型的类型)
- 通过反射获取构造方法,属性,方法信息
- [java]反射机制给属性使用set方法构造对象
- java基础之反射-通过反射调用某个属性的setter和getter方法
- java 利用反射机制,获取实体所有属性和方法,并对属性赋值
- 通过反射机制获得某个类中的属性,构造方法,方法
- java 通过反射获取调用类方法及属性
- 测试 java反射Reflection中 获取 类属性、方法、构造方法及 调用类方法改变 对象属性
- java 利用反射机制,获取实体所有属性和方法,并对属性赋值
- java 利用反射机制,获取实体所有属性和方法,并对属性赋值
- java 利用反射机制,获取实体所有属性和方法,并对属性赋值
- 通过java类的反射机制获取类的属性类型
- java 通过反射机制得到类的属性和方法