java反射-java Class基本使用

java反射-java Class基本使用


通过Class类获取对象完整包类名:

我们新建一个Student类:

1
2
3
4
5
package  com.java1234.chap07.sec01;
 
public  class  Student {
 
}

我们新建一个测试类:

1
2
3
4
5
6
7
8
9
package  com.java1234.chap07.sec01;
 
public  class  Test01 {
 
     public  static  void  main(String[] args) {
         Student student= new  Student();
         System.out.println(student.getClass().getName());
     }
}

运行输出:

com.java1234.chap07.sec01.Student


这里对象.getClass() 调用的是Object类的getClass() 得到Class对象 然后再调用Class里的getName()方法,获取到完整包路径类;


通过完整包路径类型来实例化Class对象:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package  com.java1234.chap07.sec01;
 
public  class  Test02 {
 
     public  static  void  main(String[] args) {
         try  {
             Class<?> c=Class.forName( "com.java1234.chap07.sec01.Student" );  
             System.out.println(c.getName());
         catch  (ClassNotFoundException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
     }
}

运行输出:

com.java1234.chap07.sec01.Student


通过得到Class对象,我们可以通过Class对象得到com.java1234.chap07.sec01.Student类的完整结构;



通过完整包路径类型来实例化Class对象,再通过Class对象获取Student类实例:

我们先改写下Student类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package  com.java1234.chap07.sec01;
 
public  class  Student {
 
     private  String name;
     private  Integer age;
     
     public  String getName() {
         return  name;
     }
     public  void  setName(String name) {
         this .name = name;
     }
     public  Integer getAge() {
         return  age;
     }
     public  void  setAge(Integer age) {
         this .age = age;
     }
     @Override
     public  String toString() {
         return  "Student [name="  + name +  ", age="  + age +  "]" ;
     }
     
     
}


我们写个测试类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package  com.java1234.chap07.sec01;
 
public  class  Test03 {
 
     public  static  void  main(String[] args) {
         Class<?> c= null ;
         try  {
             c=Class.forName( "com.java1234.chap07.sec01.Student" );  
             System.out.println(c.getName());
         catch  (ClassNotFoundException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
         Student s= null ;
         try  {
             s=(Student) c.newInstance();
         catch  (InstantiationException | IllegalAccessException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
         s.setName( "小锋" );
         s.setAge( 28 );
         System.out.println(s);
     }
}


我们改下上面的Student 加下有参构造方法,这样使得Student类没有默认无参构造方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package  com.java1234.chap07.sec01;
 
public  class  Student {
 
     private  String name;
     private  Integer age;
     
     
     
     public  Student(String name, Integer age) {
         super ();
         this .name = name;
         this .age = age;
     }
     public  String getName() {
         return  name;
     }
     public  void  setName(String name) {
         this .name = name;
     }
     public  Integer getAge() {
         return  age;
     }
     public  void  setAge(Integer age) {
         this .age = age;
     }
     @Override
     public  String toString() {
         return  "Student [name="  + name +  ", age="  + age +  "]" ;
     }
     
     
}

然后我们再运行上面的测试类:

QQ鎴浘20161118113800.jpg


报错了 找不到默认构造方法;


在这种情况下,我们可以通过Class类来获取Student类里的构造方法,再调用构造方法即可,我们前面说过,可以通过反射获取整个类的结构,

包括 属性 方法 构造方法 等等。


我们给下测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package  com.java1234.chap07.sec01;
 
import  java.lang.reflect.Constructor;
 
public  class  Test04 {
 
     public  static  void  main(String[] args) {
         Class<?> c= null ;
         try  {
             c=Class.forName( "com.java1234.chap07.sec01.Student" );  
             System.out.println(c.getName());
         catch  (ClassNotFoundException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
         Student s= null ;
         Constructor<?>[] cons=c.getConstructors();
         try  {
             s=(Student) cons[ 0 ].newInstance( "小锋" , 28 );
         catch  (Exception e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
         System.out.println(s);
     }
}


运行输出:

com.java1234.chap07.sec01.Student

Student [name=小锋, age=28]


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值