//JAVA反射的精妙总结:反射就是将JAVA类中的各个成分映射成相应的JAVA类
package Three11;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.*;
import java.util.*;
class banana{
private
int x;
private
int y;
public
void banana(int x,int y)
{
this.x=x;
this.y=y;
}
}
class apple {
/**
* @param args
*/
public
static void main(String[] args)throws Exception{
// TODO Auto-generatedmethod stub
String str="123456";
/*知识点一:获取Class对象方法*/
Class a1=String.class;//通过所有数据类型都有静态属性.class来获取
Class a2=str.getClass();//通过对象getClass()方法获取
// Class.forName(包名.类名);
Class a3=Class.forName("java.lang.String");//通过Class类的静态方法forName()和获得Class对象的类名来获取
System.out.println((a1==a2));
System.out.println((a1==a3));
System.out.println((a2==a3));
/*
* JAVA中九个预定义的实例对象
* 基本数据类型(byte、boolean、short、int、long、double、float、char)字节码对象以及void.class
* 另外:具有相同的数据类型和维度的数组在java中映射成同一个Class对象
*判断是否为数组类型,用Class.isArray()方法
* */
/*知识点二:Constructor类。。。。。构造方法的反射、Constructor的实例对象代表类的一个构造方法
* 用constructor类创建实例对象(反射创建)
* 注意:1.创建newInstance方法中的参数列表必须与Constructor类中的getConstructor()方法中的参数列表一致;
* 2.每调用一次newInstance方法,即构造一个对象
* 3.可以指定构造函数
* */
//获取一个类中所有的构造方法
//Constructor[]b1=Class.forName("java.lang.String").getConstructors();
//获取一个类中的某一个构造方法
Class b2=Class.forName("java.lang.String");
Constructor b22=b2.getConstructor(StringBuffer.class);
//String s1="456";//一般实例化对象
//Stringb3=(String)constructor.newInstance(new StringBuffer("456"));//通过反射实例化对象
/*
* Field类。。。。。。(成员变量的反射)
* 常用的方法:
* 1.Field getField(String s);//只能获取该类公有和父类中公有
* 2.Field getDeclaredField(String s);//获取该类中任意成员变量,包括私有
* 3.setAcessible(true);如果是私有字段,要先将私有字段进行取消权限检查的能力。也称暴力访问
* 4.set(Object
obj,Object value)将指定对象变量上此Field对象表示的字段设置为指定的新值
* 5.Object get(Object
obj);返回指定对象上Field表示的字段的值
* */
/*
* 知识点三:Method类。。。。。。(成员方法的反射):代表某个类中的一个成员方法
* 常用方法:
*1.Method[]getMethods();只获取公共和父类中的所有方法
*2.Method[]getDeclaredMethods();获取本类中方法包含私有方法
* 3.Medthod[]getMethod("方法名",参数.class(空参可以写null));
* 4.Object invoke(Object
obj,参数);调用方法:如果方法是静态的,invoke中的参数可写为null
*
* 通过反射来调用main函数,invoke()方法传递一个字符串数组参数的方法
* 1.me.invoke(null,newobject[](new String[]{“11”,“22”,“33”}));
* 2.me.invoke(null,(Object)newString[]{“11”,“22”,“33”});
* */
String str1="abcd";//实例化str1对象
//通过反射获取方法
Method mchar=Class.forName("java.lang.String").getMethod("charAt",int.class);
//通过invoke方法获取执行charAt里面的功能,当invoke第一个参数为null时,代表调用main函数
System.out.println(mchar.invoke(str1, 1));
//不清楚类名调用方法,体现了反射功能的强大
//Methodme=Class.forName("fansge.Test12").getMethod("main",String[].class);
//me.invoke(null, (Object)new String[]{"aa","bb","cc"});
/*
* 知识点四:
* 1.具有相同类型和维数的数组属于同一类型,即有相同的Class实例对象
* 2.数组的字节码文件名是:数组类型的第一个大写字母;例:int为I
* 3.数组对象的Class的实例对象的getSuperclass()返回的是父类Object类的Class对象
* 4.基本类型的一维数组可以当做Object类型使用,不能当做Object[]类型使用;非基本类型
* 的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用。
* 5.Arrays.asList()方法处理int[]和String[]时的差异:1.4和1.5新特性差别。1.4无法处理int数组,
* 返回给1,5处理,1.5将int数组作为一个参数处理
* 6.数组的反射:Array工具类用于完成数组反射的操作。
Array.getLength(Object
obj);//获取数组长度
Array.get(Object
obj,intx);// 获取数组中的元素
7.获得某个数组中的某个元素的类型
例:
Object[] obj=new Object[]{"ABC",1}
* */
Object[] obj=new Object[]{"123",1};
System.out.println("obj=:"+obj);
}
}