Java反射机制 之 获取类的 方法 和 属性(包括构造函数)(Day_06)
把自己立成帆,才能招来凤。
-
运行环境
JDK8 + IntelliJ IDEA 2018.3
-
本文中使用的jar包链接
https://files.cnblogs.com/files/papercy/jsoup_jar%E5%8C%85.rar
-
获取构造函数(方法)
需要获取类的结构
1 package com.wenhaitao.Demo2; 2 3 public class Student { 4 private String name; 5 private int age; 6 private String sex; 7 8 public Student() { 9 } 10 11 public Student(String name, int age, String sex) { 12 this.name = name; 13 this.age = age; 14 this.sex = sex; 15 } 16 17 public String getName() { 18 return name; 19 } 20 21 public void setName(String name) { 22 this.name = name; 23 } 24 25 public int getAge() { 26 return age; 27 } 28 29 public void setAge(int age) { 30 this.age = age; 31 } 32 33 public String getSex() { 34 return sex; 35 } 36 37 public void setSex(String sex) { 38 this.sex = sex; 39 } 40 41 @Override 42 public String toString() { 43 return "Student{" + 44 "name='" + name + '\'' + 45 ", age=" + age + 46 ", sex='" + sex + '\'' + 47 '}'; 48 } 49 }
通过 getFields() getDeclaredFields() getField() getDeclaredField()这四个方法获取各种字段
1 package com.wenhaitao.Demo2; 2 3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.Field; 5 import java.lang.reflect.Method; 6 import java.util.Arrays; 7 8 public class Demo1 { 9 public static void main(String[] args) { 10 Student student = new Student(); 11 Class clzstu = student.getClass(); 12 Field[] fields= clzstu.getDeclaredFields(); 13 System.out.println(Arrays.toString(fields)); 14 15 try { 16 Field field = clzstu.getDeclaredField("name"); 17 System.out.println("field:"+field); 18 } catch (NoSuchFieldException e) { 19 e.printStackTrace(); 20 } 21 Field[] fields1 =clzstu.getDeclaredFields(); 22 System.out.println("fields1:"+fields1); 23 System.out.println(Arrays.toString(fields1)); 24 25 // Method 26 try { 27 Method method =clzstu.getMethod("test",String.class); 28 System.out.println("*****************"); 29 System.out.println("method:"+method); 30 Method[] methods = clzstu.getMethods(); 31 System.out.println("methods:"+methods); 32 System.out.println("****************"); 33 System.out.println(Arrays.toString(methods)); 34 System.out.println("*****************"); 35 Method[] methods1=clzstu.getDeclaredMethods(); 36 System.out.println("methods1:"+Arrays.toString(methods1)); 37 38 39 } catch (NoSuchMethodException e) { 40 e.printStackTrace(); 41 } 42 // modifiler 43 int num = clzstu.getModifiers(); 44 System.out.println("num:"+num); 45 46 // constructor 47 try { 48 Constructor constructor =clzstu.getConstructor(String.class); 49 System.out.println("constructor:"+constructor); 50 } catch (NoSuchMethodException e) { 51 e.printStackTrace(); 52 } 53 // constructors 54 Constructor[] constructors = clzstu.getConstructors(); 55 System.out.println("constructor:"+constructors); 56 System.out.println("*****************"); 57 System.out.println(Arrays.toString(constructors)); 58 59 // 60 61 } 62 63 }
结论:
getFields()返回所有
public
的字段。
getDeclaredFields()返回所有
private
和public字段
。
getField()
返回指定字段名public
的字段。
getDeclaredField()
返回指定字段名的private
和public字段名
。
- 获取类中的方法
1 public void method1(String str){ 2 System.out.println("public 修饰的方法"); 3 } 4 5 private void method2(){ 6 System.out.println("private 修饰的方法"); 7 } 8 9 String method3(String name,Integer sex,Date age){ 10 System.out.println("默认修饰"+name+" "+sex+" "+age); 11 return name+" "+sex+" "+age; 12 } 13 14 protected void method4(){ 15 System.out.println("protected 修饰的方法"); 16 }
通过 getMethods() getDeclaredMethods() getMethod() getDeclaredMethod()这四个方法获取各种方法
1 import java.lang.reflect.Method; 2 import java.util.Date; 3 4 public class Test06 { 5 public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException { 6 7 //加载Class对象 8 //会报出不存在该类的异常 9 Class c=Class.forName("com.reflection.model.Student"); 10 11 //获取所有公共方法 12 System.out.println("================获取所有公共方法================="); 13 Method[] methods=c.getMethods(); 14 for (Method method:methods) { 15 System.out.println("公共方法:"+method); 16 } 17 //获取所有方法 18 System.out.println("================获取所有的方法================="); 19 Method[] declaredMethods=c.getDeclaredMethods(); 20 for (Method declaredmethod:declaredMethods) { 21 System.out.println("所有方法:"+declaredmethod); 22 } 23 24 System.out.println("================获取特定(带参)方法================="); 25 Method method1=c.getMethod("method1",String.class); 26 System.out.println("特定(带参)方法:"+method1); 27 28 System.out.println("================获取特定(不带参)方法================="); 29 Method method2=c.getDeclaredMethod("method2"); 30 System.out.println("特定(不带参)方法:"+method2); 31 32 System.out.println("================获取特定(多参)方法================="); 33 Method method3=c.getDeclaredMethod("method3", String.class, Integer.class, Date.class); 34 System.out.println("特定(多参)方法:"+method3); 35 } 36 }
结论:
getMethods()返回所有
public
的方法,通过结果可以看出getMethods()连父类中的
。public
方法也可以获取到getDeclared
Method
s()返回所有private
和public方法名,
。getDeclared
Method
s()获取不到父类中的方法,只能获取到本来中的方法
get
返回指定字段名Method
()public
的方法名。getDeclared
返回指定字方法名的Method
()private
和public字段名
。
获取到父类的构造方法,getConstructors()不能
getDeclaredConstructors()也
只能获取到本类中的
构造方法
-
-
-
ps:
-
-
如果,您希望更容易地发现我的新博客,不妨点击一下关注。
如果你觉得本篇文章对你有所帮助,请给予我更多的鼓励,
因为,我的写作热情也离不开您的肯定支持,感谢您的阅读,我是【肥肥也】!