欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java-反射

程序员文章站 2023-10-15 15:20:08
1 获得所有公共的构造方法 2 获得所有的构造方法 3 获得公有 无参的构造方法 4 获得公有 有参的构造方法 5 获得私有 有参的构造方法 6 获得所有公共的方法 7 获得所有方法 8 获取公有 无参方法 9 获取公有 有参方法 10 获取私有 有参方法 11 获取所有属性 12 获得属性值 ......

//测试类

java-反射
 1 package com.test;
 2 
 3 public class student {
 4 
 5     private int stunum;
 6     private string stuname;
 7     private string stuclass;
 8     
 9     private student(int stunum) {
10         this.stunum = stunum;
11     }
12     student(int stunum, string stuname) {
13         this.stunum = stunum;
14         this.stuname = stuname;
15     }
16     public student() {
17         
18     }
19     public student(int stunum, string stuname, string stuclass) {
20         this.stunum = stunum;
21         this.stuname = stuname;
22         this.stuclass = stuclass;
23     }
24     
25     public void show1(string stuname){
26         system.out.println("公有的 string参数的show1():stuname=" + stuname);
27     }
28     public void show2() {
29         system.out.println("公有的 无参的show2()");
30     }
31     protected void show3(){
32         system.out.println("受保护的 无参的show2()");
33     }
34     void show4(){
35         system.out.println("默认的 无参的show3()");
36     }
37     private string show5(int stunum){
38         system.out.println("私有的 并且有返回值的,int参数的show4():age=" + stunum);
39         return stunum+"abc";
40     }
41     
42     public int getstunum() {
43         return stunum;
44     }
45     public void setstunum(int stunum) {
46         this.stunum = stunum;
47     }
48     public string getstuname() {
49         return stuname;
50     }
51     public void setstuname(string stuname) {
52         this.stuname = stuname;
53     }
54     public string getstuclass() {
55         return stuclass;
56     }
57     public void setstuclass(string stuclass) {
58         this.stuclass = stuclass;
59     }
60     
61     @override
62     public string tostring() {
63         return "student [stunum=" + stunum + ", stuname=" + stuname + ", stuclass=" + stuclass + "]";
64     }
65 }
view code

 //开始测试

java中的反射机制就是对于任意一个类,都能知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个属性和方法这种动态获取信息以及动态调用对象的方法就是java语言中的反射

1         class clazz1 = student.class;    //第一种:任何一个类都有一个隐含的静态成员变量class
2         
3         class clazz2 = new student().getclass();    //第二种:已经有了该类的对象通过getclass方法
4         
5 //        system.out.println(clazz1 == clazz2);    //true
6         
7         class clazz3 = class.forname("com.test.student");//第三种:动态加载
8         
9 //        system.out.println(clazz2 == clazz3);    //true

 获取所有公共的构造方法

1         constructor[] conarr = clazz3.getconstructors();
2         for(constructor c : conarr){
3 //            public com.test.student()
4 //            public com.test.student(java.lang.string,java.lang.string)
5             system.out.println(c);
6         }

 获取所有的构造方法

1         conarr = clazz3.getdeclaredconstructors();
2         for(constructor c : conarr){
3 //            public com.test.student()
4 //            public com.test.student(java.lang.string,java.lang.string)
5 //            com.test.student(java.lang.string,java.lang.string)
6 //            private com.test.student(java.lang.string)
7             system.out.println(c);
8         }

 获取公有 无参的构造方法

1         //因为是无参的构造方法所以类型是一个null,不写也可以:这里需要的是一个参数的类型,切记是类型
2         //返回的是描述这个无参构造函数的类对象。
3         constructor con = clazz3.getconstructor(null);
4         object obj = con.newinstance();        //调用构造方法
5         student stu = (student) obj;
6         system.out.println(stu);        //student [stunum=null, stuname=null, stuclass=null]

 获取公有 有参的构造方法

1      con = clazz3.getconstructor(int.class,string.class,string.class);
2         obj = con.newinstance(100023,"chenkaixin","150101");    //使用此 constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。
3         stu = (student) obj;
4         system.out.println(stu);        //student [stunum=100023, stuname=chenkaixin, stuclass=150101]

 获取私有 有参的构造方法

1       con = clazz3.getdeclaredconstructor(int.class);
2         con.setaccessible(true); //启用或禁用安全检查 访问私有的方法或变量时必须设置为true
3         obj = con.newinstance(100023);    //调用构造方法
4         stu = (student) obj;
5         system.out.println(stu);        //student [stunum=100023, stuname=null, stuclass=null]

 获取所有公共的方法

 1         method[] methodarr = clazz3.getmethods();
 2         for(method m : methodarr){
 3 //            public java.lang.string com.test.student.tostring()
 4 //            public void com.test.student.show2()
 5 //            public void com.test.student.show1(java.lang.string)
 6 //            public void com.test.student.setstuclass(java.lang.string)
 7 //            public void com.test.student.setstunum(int)
 8 //            public int com.test.student.getstunum()
 9 //            public void com.test.student.setstuname(java.lang.string)
10 //            public java.lang.string com.test.student.getstuname()
11 //            public java.lang.string com.test.student.getstuclass()
12 //            public final void java.lang.object.wait() throws java.lang.interruptedexception
13 //            public final void java.lang.object.wait(long,int) throws java.lang.interruptedexception
14 //            public final native void java.lang.object.wait(long) throws java.lang.interruptedexception
15 //            public boolean java.lang.object.equals(java.lang.object)
16 //            public native int java.lang.object.hashcode()
17 //            public final native java.lang.class java.lang.object.getclass()
18 //            public final native void java.lang.object.notify()
19 //            public final native void java.lang.object.notifyall()
20             system.out.println(m);
21         }

 获取所有方法

 1         methodarr = clazz3.getdeclaredmethods();
 2         for(method m : methodarr){
 3 //            public java.lang.string com.test.student.tostring()
 4 //            public void com.test.student.show2()
 5 //            public void com.test.student.show1(java.lang.string)
 6 //            private java.lang.string com.test.student.show5(int)
 7 //            void com.test.student.show4()
 8 //            public void com.test.student.setstuclass(java.lang.string)
 9 //            public void com.test.student.setstunum(int)
10 //            public int com.test.student.getstunum()
11 //            public void com.test.student.setstuname(java.lang.string)
12 //            protected void com.test.student.show3()
13 //            public java.lang.string com.test.student.getstuname()
14 //            public java.lang.string com.test.student.getstuclass()
15             system.out.println(m);
16         }

 获取公有 无参方法

1         method m = clazz3.getmethod("show2");
2         //执行这个方法
3         m.invoke(obj);    //公有的 无参的show2()

 获取公有 有参方法

1         m = clazz3.getmethod("show1", string.class);
2         m.invoke(obj,"chenkaixin12121");    //公有的 string参数的show1():stuname=chenkaixin12121

获取私有 有参方法

1         m = clazz3.getdeclaredmethod("show5", int.class);
2         m.setaccessible(true);    //解除私有限定
3         object o = m.invoke(obj,12121);    //私有的 并且有返回值的,int参数的show4():age=12121
4         system.out.println(o);    //12121abc

 获取所有属性

1         field[] fields = clazz3.getdeclaredfields();
2         for(field f : fields){
3 //            public java.lang.string com.test.student.tostring()
4 //            private java.lang.string com.test.student.show4(int)
5 //            void com.test.student.show3()
6 //            public void com.test.student.show1(java.lang.string)
7 //            protected void com.test.student.show2()
8             system.out.println(f);
9         }

获得属性值

1         /*
2         system.out.println("--------获取属性的值---------");
3         field field = clazz3.getdeclaredfield("stunum");
4         field.setaccessible(true);
5         string value = field.get(new student(111,"aaa")).tostring();
6         system.out.println(value);    //111
7          */