java 反射
package fanshe;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class 反射大法 {
static String 静态属性="静态属性内容";
String 动态属性="动态属性内容";
int i=11;
public 反射大法(){
System.out.println("构造函数 --无参数");
}
public 反射大法(String text){
System.out.println("构造函数 --有参数:"+text);
}
public static void 公开_静态_无参_无返回(){
System.out.println("公开_静态_无参_无返回");
}
public static void 公开_静态_有参_无返回(String text){
System.out.println("公开_静态_无参_无返回:"+text);
}
public static String 公开_静态_有参_有返回(String text){
return "公开_静态_无参_无返回:"+text;
}
private String 私有_动态_有参_有返回(String text){
return "公开_静态_无参_有返回:"+text;
}
/*
* ********* getConstructor()和getDeclaredConstructor()区别:*********
getDeclaredConstructor(Class<?>... parameterTypes)
这个方法会返回制定参数类型的所有构造器,包括public的和非public的,当然也包括private的。
getDeclaredConstructors()的返回结果就没有参数类型的过滤了。
再来看getConstructor(Class<?>... parameterTypes)
这个方法返回的是上面那个方法返回结果的子集,只返回制定参数类型访问权限是public的构造器。
getConstructors()的返回结果同样也没有参数类型的过滤。
*
* Declared 代表获取所有 不加 代表仅仅获取公开
*
* */
public static void 反射构造函数无参例子() throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
反射大法 p=new 反射大法();
//获取class 字节码的4种方法 实例对象.getclass 类.class class.forname(包名+类名) 类.TYPE
Class 类字节码=p.getClass();
//根据字节码获取方法对象
//===============根据实例的对象 重新实例并获取该对象
Constructor 构造方法=类字节码.getConstructor();//若获取的方法有参数 直接传入参数类型的字节码 int.class
反射大法 t=(反射大法) 构造方法.newInstance();//若有参数 直接传入
//根据构造函数得到对象 可以调用原对象所有方法
System.out.println(t.私有_动态_有参_有返回("ooooo"));
}
public static void 反射构造函数有参例子() throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
反射大法 p=new 反射大法();
//获取class 字节码的三种方法 实例对象.getclass 类.class class.forname(包名+类名)
Class 类字节码=p.getClass();
//根据字节码获取方法对象
//===============根据实例的对象 重新实例并获取该对象
Constructor 构造方法=类字节码.getConstructor(String.class);//若获取的方法有参数 直接传入参数类型的字节码 int.class
反射大法 t=(反射大法) 构造方法.newInstance("突突突突突突拖拖拖");//若有参数 直接传入
System.out.println(t.getClass().getName());
}
public static void 反射获取属性例子() throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException{
反射大法 p=new 反射大法();
//获取class 字节码的三种方法 实例对象.getclass 类.class class.forname(包名+类名)
Class 类字节码=p.getClass();
//根据字节码获取方法对象
//===============
Field 属性=类字节码.getField("动态属性");//获取属性
//操作属性 私有属性需要设置可访问权限 setaccessible
//pass
}
public static void 反射获取公开_静态_无参_无返回_方法例子() throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
反射大法 p=new 反射大法();
Class 类字节码=p.getClass();
//不清楚对象类型 用object 清楚用对象类型要强转 创建对象
反射大法 方法实例对象=(反射大法) 类字节码.getDeclaredConstructor().newInstance();
System.out.println("==============");
Method 方法=类字节码.getMethod("公开_静态_无参_无返回");//有参数填入参数类型
System.out.println("==============");//method.setAccessible(true);私有属性设置
方法.invoke(方法实例对象);//有参数 填入参数内容
}
public static void 反射获取公开_静态_有参_无返回_方法例子() throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
反射大法 p=new 反射大法();
Class 类字节码=p.getClass();
//不清楚对象类型 用object 清楚用对象类型要强转 创建对象
反射大法 方法实例对象=(反射大法) 类字节码.getDeclaredConstructor().newInstance();
System.out.println("==============");
Method 方法=类字节码.getMethod("公开_静态_有参_无返回",String.class);//有参数填入参数类型
System.out.println("==============");//method.setAccessible(true);私有属性设置
方法.invoke(方法实例对象,"嘿嘿嘿嘿嘿");//有参数 填入参数内容 invoke 方法 有返回值具体看执行方法
}
public static void 反射查询所有方法(){
反射大法 p=new 反射大法();
Class 类字节码=p.getClass();
//查询类中所有犯法
System.out.println("获取方法列表=============");
Method[] 方法数组=类字节码.getMethods();
for(Method x:方法数组){
System.out.println(x);
}
System.out.println("结束========================");
}
public static void 反射查询所有属性(){
反射大法 p=new 反射大法();
Class 类字节码=p.getClass();
//查询类中所有犯法
System.out.println("获取属性列表=============");
Field[] 属性数组=类字节码.getDeclaredFields();
for(Field x:属性数组){
System.out.println(x.getName()+x.getType().getName());
}
System.out.println("结束========================");
}
public static void 反射获取私有属性值() throws NoSuchFieldException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException{
反射大法 p=new 反射大法();
Class 类字节码=p.getClass();
//查询类中所有犯法
//Field对象的获得
//Field[] fields = c.getFields();//取得所有public属性(包括父类继承) 有bug
//Field[] fields = c.getDeclaredFields();//取得所有声明的属性
Field 属性=类字节码.getDeclaredField("静态属性");
反射大法 属性实例对象 = (反射大法)类字节码.getConstructor().newInstance();
//设置可访问权限
属性.setAccessible(true);
System.out.println(属性.get(属性实例对象));//获取内容
属性.set(属性实例对象, "反射设置新内容666666666666");//修改内容
System.out.println(属性.get(属性实例对象));
}
public static void getinterfaces() throws ClassNotFoundException{
//获取类实现的所有接口
Class c =Class.forName("java.util.ArrayList");
Class[] in=c.getInterfaces();
for(Class x:in){
System.out.println(x.getName());
}
}
public static void main(String[] args) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException {
反射构造函数无参例子();
}
}