码迷,mamicode.com
首页 > 其他好文 > 详细

反射与注解

时间:2019-06-08 01:10:17      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:系统   先后   java   常量   类加载器   not   信息   tag   编写   

反射:

1.获取一个类Class对象的三种方法:  Class类的forName()方法;类的class属性;对象的getClass()方法。以及基本数据类型及其包装类的Class对象;数据类型相同并维度相同时,其对象共享一个Class对象。具体见如下实例:


public class Test1 {
public static void main(String[] args) throws ClassNotFoundException {
//1.采用目标类的.class属性-->每个类都有包装类(Type属性):
Class c1 = Users.class;
System.out.println(c1);

//2.Object类的getClass()方法:
Users users = new Users();
Class c2 = users.getClass();
//getSimpleClass():只获得类的名称,不包含包名
System.out.println(users);
System.out.println(c2);

//3.Class类的forName()方法:
Class c3 = Class.forName("TestMyself.Users");
System.out.println(c2);

//4.基本数据类型的Class对象,与其包装类的Class对象是Type属性获得
Class i1 = int.class;
Class i2 = Integer.TYPE;
System.out.println(i1==i2);
}
}

2.测试静态代码块:最终证实:静态代码块先于构造方法执行,其执行的结果和static块写的先后顺序有关:

 1 /*
 2 最终输出结果:
 3 A的静态代码块~~~
 4 A的构造方法~~~
 5 m=300
 6  */
 7 public class Test2 {
 8     public static void main(String[] args) {
 9         A a = new A();
10     }
11 }
12 class A{
13     static{
14         System.out.println("A的静态代码块~~~");
15         m=299;
16     }
17     static int m=100;
18     static{
19         m=300;
20     }
21     public A(){
22         System.out.println("A的构造方法~~~");
23         System.out.println("m="+m);
24     }
25 }

3.测试什么情况下类会被加载:new 对象;调用父类的静态变量;

 1 public class Test3 {
 2     public static void main(String[] args) throws ClassNotFoundException {
 3         //1.主动加载
 4         Son son = new Son();
 5 
 6         //2.通过子类引用父类的静态变量,会让父类加载
 7         System.out.println(Son.a);
 8 
 9         //3.Class.forName()方法让子类加载
10         Class c = Class.forName("TestMyself.Son");
11 
12         //4.定义数组,类不会被加载
13         Son[] sons=new Son[3];
14 
15         //5.调用静态常量类也不会被加载
16         System.out.println(Son.c);
17     }
18 }
19 class Father{
20     static int a=100;
21     static{
22         System.out.println("Father 静态代码块");
23     }
24 }
25 
26 class Son extends Father{
27     static int b=200;
28     static final int c=300;
29     static{
30         System.out.println("Son 静态代码块");
31     }
32 }

4.获得类加载器:

 1 //获得类加载器--->Class.getClassLoader():Class对象获得类加载器
 2 public class Test4 {
 3     public static void main(String[] args) throws ClassNotFoundException {
 4         //系统类加载器:-->加载用户定义的类
 5         ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
 6         System.out.println(systemClassLoader);
 7 
 8         //扩展类加载器:-->加载扩展类
 9         ClassLoader parent = systemClassLoader.getParent();
10         System.out.println(parent);
11 
12         //根加载器:--->加载核心类(用c/c++编写):
13         ClassLoader parent1 = parent.getParent();
14         System.out.println(parent1);
15 
16         ClassLoader classLoader = Class.forName("java.lang.String").getClassLoader();
17     }
18 }

5.通过Class对象获得类的:名称;属性;方法;构造方法;

 1 //通过反射获得类的信息(通过Class对象):
 2 //名称;属性;方法;构造;
 3 public class Test5 {
 4     public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
 5         Class c1 = Class.forName("TestMyself.Users"); //获得Class对象
 6         Class c2 = Class.forName("java.lang.String");
 7 
 8         //1.获得类名:
 9         String name = c1.getName();
10         String simpleName = c1.getSimpleName();
11         System.out.println("name:"+name+"   simpleName:"+simpleName);
12         System.out.println("=================================================");
13 
14         //2.获得属性:
15         Field[] fields = c1.getFields();   //getFields():只能获得public属性
16         for (Field field : fields) {
17             System.out.println(field);
18         }
19         Field[] declaredFields = c1.getDeclaredFields(); //获得全部的属性
20         for (Field declaredField : declaredFields) {
21             System.out.println(declaredField);
22         }
23         System.out.println("============================================================");
24         
25         //3.获得方法:
26         Method[] methods = c1.getMethods(); //getMethods():获得本类和父类的所有public方法
27         for (Method method : methods) {
28             System.out.println("public 方法:"+method);
29         }
30 
31         Method[] Methods = c1.getDeclaredMethods();//获得本类的所有方法
32         for (Method declaredMethod : Methods) {
33             System.out.println("本类方法:"+declaredMethod);
34         }
35         //对于要获得重载方法:如果只知道方法名字是找不到具体方法的
36         //("方法名",参数的Class对象)
37         System.out.println("==================================================");
38         Method getAge = c1.getMethod("getAge", null);
39         Method setName = c1.getMethod("setName", String.class);
40         System.out.println(getAge);
41         System.out.println(setName);
42 
43         //4.获得构造器:
44         //获得无参构造
45         System.out.println("=====================================================");
46         Constructor constructor = c1.getConstructor();
47 
48         //获得有参构造:(参数的Class对象)
49         Constructor constructor1 = c1.getConstructor(String.class, int.class, int.class);
50 
51         System.out.println("无参构造:"+constructor);
52         System.out.println("有参构造:"+constructor1);
53 
54 
55     }
56 }

 

 

 

反射与注解

标签:系统   先后   java   常量   类加载器   not   信息   tag   编写   

原文地址:https://www.cnblogs.com/xbfchder/p/10989583.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!