标签:系统 先后 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