一、反射
package com.easy22;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.Serializable;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.Date;
public class Easy {
//class类用来描述类是怎样定义的
//每一个类都具有自己的类对象(Class的对象),这个类对象用来描述该类是怎样定义的
//可以通过某个类的类对象,动态的获取和调用类中声明的属性和方法
//如果需要动态的获取某个类的属性和方法,就必须获得该类的类对象
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException,
SecurityException, InstantiationException, IllegalAccessException, NoSuchMethodException,
IllegalArgumentException, InvocationTargetException, IntrospectionException {
//获取类对象的方式有三种
Class clazz=Demo.class; //多数用来测试
clazz=new Demo().getClass();
clazz=Class.forName("com.easy22.Demo");
//获取一个类中定义的属性
//getField("属性名字"); 获取一个指定名字的public定义的属性
Field f1=clazz.getField("name");
//getFields 获取所有public定义的属性
Field[] f_arr=clazz.getFields();
//获取所有定义的属性包含private
//反射会破坏封装性
f1=clazz.getDeclaredField("weight");
f_arr=clazz.getDeclaredFields();
//通过反射实例化一个对象
//new Object() newInstance() 必须有可访问的空构造方法
Object obj=clazz.newInstance();
//设置属性可访问
f1.setAccessible(true);
//给对象注入属性值
f1.set(obj, 81);
//获取属性值
//f1.get(obj);
System.out.println(obj);
//获取方法
//方法重载 一个类中方法名一样
Method m1=clazz.getMethod("test1",String.class,Date.class);
//通过方法对象驱动一个对象执行该方法 invoke调用
m1.invoke(obj,"你好",null);
//获取所有的私有方法
Method[] m_arr=clazz.getDeclaredMethods();
//获取所有的构造方法
//clazz.getConstructor();
//获取无参的构造方法
//通过参数列表获取构造方法
Constructor con=clazz.getDeclaredConstructor();
//通过构造方法实例化对象
con.newInstance();
//获取该类对象继承的父类
Class su=clazz.getSuperclass();
System.out.println(su);
//获取该类对象的实现的接口
Class[] c_arr=clazz.getInterfaces();
System.out.println(Arrays.toString(c_arr));
int m=f1.getModifiers();
boolean b=Modifier.isPublic(m);
System.out.println(b);
b=Modifier.isPrivate(m);
System.out.println(b);
b=Modifier.isStatic(m);
System.out.println(b);
//内省 获得BeanInfo对象 针对JavaBean的操作
BeanInfo bi=Introspector.getBeanInfo(clazz);
//获取属性的介绍
PropertyDescriptor[] ppd_arr=bi.getPropertyDescriptors();
System.out.println(ppd_arr[0].getName());
//set方法(写的方法)
ppd_arr[0].getWriteMethod().invoke(obj,18);
System.out.println(obj);
}
}
class Demo extends Easy implements Serializable,Cloneable{
public String name;
public int age;
private double weight;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
public void test1(String str,Date date) {
System.out.println("test1 method"+weight+str+date);
}
@Override
public String toString() {
return "Demo [name=" + name + ", age=" + age + ", weight=" + weight + "]";
}
}
二、JVM