您的位置:首页 > 其它

类的加载与类加载器、反射与枚举

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;
}
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: