类的加载与类加载器、反射与枚举
2018-02-02 15:42
204 查看
类的加载与类加载器、反射与枚举
对于上个博客的特注:在实现局域网内的互相发送与接收时,必须打开各自电脑的网络发现,否则将会出现发送不到、接收不到的情况。1、类的加载
(1)加载:就是指将class文件读入内存,并为之创建一个Class对象。任何类被使用 时系统都会建立一个Class对象。 (2)连接 验证:是否有正确的内部结构,并和其他类协调一致。 准备:负责为类的静态成员分配内存,并设置默认初始值。 解析:将类的二进制数据中的符号引用替换为直接引用。 (3)初始化 在类的初始化阶段,虚拟机负责对类进行初始化,主要是对静态属性进行初始化。
2、类加载器的分类:
Bootstrap ClassLoader 根类加载器 Extension ClassLoader 扩展类加载器 System ClassLoader 系统类加载器
package com.hwadee; public class Student { // 字段 fields int age; String name; //构造方法 constructor public Student() { System.out.println("这是无参构造方法"); } public Student(int age,String name) { this.age=age; this.name=name; } //方法 method public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public void printStudentInfo() { } }
package com.hwadee; //对象名.getClass() 类名.class Class.forName("路径名.类名");这三个都是获取Student的字节码文件 public class Test1 { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException { TestGetClass(); } public static void TestGetClass() throws ClassNotFoundException, InstantiationException, IllegalAccessException { Student s1=new Student(); Class clazz1=s1.getClass(); Class clazz2=Student.class; Class clazz3 = Class.forName("com.hwadee.Student"); Student s2 = (Student)clazz1.newInstance(); //通过字节码文件创建Student对象--->newInstance } }
3、通过反射获取构造方法
package com.hwadee; public class Star { public String name; private String city; private int age; public Star() { } private Star(String name) { this.name=name; } public Star(String name, String city, int age) { super(); this.name = name; this.city = city; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Star [name=" + name + ", city=" + city + ", age=" + age + "]"; } private void Gossip(String message) { System.out.println("爆料!!!"+message); } }
package com.hwadee; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; public class Test2 { public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { test1(); test2(); test3(); } public static void < 4000 span class="hljs-title">test1() throws ClassNotFoundException { Class clazz = Class.forName("com.hwadee.Star"); Constructor[] constructor = clazz.getConstructors(); for(Constructor c:constructor) { System.out.println(c); } } public static void test2() throws ClassNotFoundException { Class clazz = Class.forName("com.hwadee.Star"); Constructor[] constructors = clazz.getDeclaredConstructors(); for(Constructor c:constructors) { System.out.println(c); } } public static void test3() throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { Class clazz = Class.forName("com.hwadee.Star"); Constructor constructors = clazz.getDeclaredConstructor(String.class); constructors.setAccessible(true); Object newInstance = constructors.newInstance("不错呀"); Star s=(Star)newInstance; System.out.println(s); } }
4、通过反射获取成员变量
package com.hwadee; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Modifier; public class Test3 { public static void main(String[] args) throws Exception { test1(); test2(); test3(); test4(); } public static void test1() throws ClassNotFoundException { Class clazz=Class.forName("com.hwadee.Star"); Field[] fields = clazz.getFields(); for(Field f:fields) { System.out.println(f); } } public static void test2() throws ClassNotFoundException { Class clazz=Class.forName("com.hwadee.Star"); Field[] fields = clazz.getDeclaredFields(); for(Field f:fields) { System.out.println(f); } } public static void test3() throws ClassNotFoundException { Class clazz=Class.forName("com.hwadee.Star"); Field[] fields = clazz.getDeclaredFields(); int pub=Modifier.PUBLIC; System.out.println("pub="+pub); int pri=Modifier.PRIVATE; System.out.println("pri="+pri); for(Field f:fields) { Class<?> type = f.getType(); int modifiers = f.getModifiers(); System.out.println(f+"----"+type+" "+modifiers); } } public static void test4() throws Exception { Class<?> clazz = Class.forName("com.hwadee.Star"); Constructor<?> c = clazz.getDeclaredConstructor(String.class); c.setAccessible(true); Object obj = c.newInstance("江疏影"); Star star=(Star)obj; Field field = clazz.getDeclaredField("age"); field.setAccessible(true); field.set(star, 28); Field field2 = clazz.getDeclaredField("city"); field2.setAccessible(true); field2.set(star, "北京"); System.out.println(star); } }
5、通过反射获取方法
package com.hwadee; import java.lang.reflect.Method; public class Test4 { public static void main(String[] args) throws Exception { test1(); test2(); test3(); test4(); } public static void test1() throws ClassNotFoundException { Class<?> clazz = Class.forName("com.hwadee.Star"); Method[] methods = clazz.getMethods(); for(Method m:methods) { System.out.println(m); } } public static void test2() throws ClassNotFoundException { Class<?> clazz = Class.forName("com.hwadee.Star"); Method[] methods = clazz.getDeclaredMethods(); for(Method m:methods) { System.out.println(m); } } public static void test3() throws ClassNotFoundException { Class<?> clazz = Class.forName("com.hwadee.Star"); Method[] methods = clazz.getDeclaredMethods(); for(Method m:methods) { System.out.println(m+"----"+m.getReturnType()); } } public static void test4() throws Exception { Class<?> clazz = Class.forName("com.hwadee.Star"); Object obj = clazz.newInstance(); Star star=(Star)obj; Method method = clazz.getDeclaredMethod("Gossip", String.class); method.setAccessible(true); //以前 对象.方法名(输入参数) Object invoke = method.invoke(star, "刘亦菲还是那个小龙女"); //System.out.println(invoke); } }
6、枚举
是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内。 回想单例设计模式:单例类是一个类只有一个实例,那么多例类就是一个类有多个实 例,但不是无限个数的实例,而是有限个数的实例,这才能是枚举类。
package com.hwadee; public enum EasonEnum { SPRING,FALL,SUMMER,WINTER; }
package com.hwadee; import javax.swing.text.StyledEditorKit.ForegroundAction; public class Test5 { public static void main(String[] args) { test1(EasonEnum.WINTER); EasonEnum[] values = EasonEnum.values(); for(EasonEnum s:values) { System.out.println(s); } } public static void test1(EasonEnum s) { switch (s) { case SPRING: System.out.println("春暖花开"); break; case SUMMER: System.out.println("夏至未至"); break; case FALL: System.out.println("秋高气爽"); break; case WINTER: System.out.println("冰冻三尺"); break; default: System.out.println("地球没有这个季节!!!"); break; } } }
相关文章推荐
- Java基础 - 类的加载,类加载器,反射,动态代理,模板设计模式,JDK5新特性,枚举(类),JDK1.7新特性
- Java基础加强_Eclipse、枚举、反射、注解、泛型、类加载器、动态代理
- 高新_枚举、反射、泛型、类加载器、动态代理
- 黑马程序员————java中类的加载、反射、动态代理、枚举
- 黑马程序员--Java学习日记之类的加载,反射,动态代理,枚举
- 黑马程序员--高新技术--枚举、反射、注解、类加载器、内省
- 类加载机制与反射
- 利用反射模拟框架 类加载器 加载配置文件
- 巧用Mono.Cecil反射加载类型和方法信息
- Java类加载与反射
- 深入理解Java:类加载机制及反射
- Java基础进阶_day18_(类加载器,反射,动态代理)
- java 高新技术【6】 反射开发框架以及用 类加载器 管理资源和配置文件
- 李刚老师著疯狂Java部分章节-Java类加载和类反射
- 跟王老师学反射(二):Java类的加载、连接和初始化
- Cedar老师的java中的反射学习笔记(二)--动态加载
- java反射学习笔记(2)----java中的静态加载类和动态加载类
- (C#)利用反射动态调用类成员、动态加载控件以及插件编程思想
- 类加载机制及反射
- 【译】12. Java反射——类的动态加载和重新加载