-
六、通过反射了解集合泛型的本质
1、通过Class和Method了解泛型的本质
2、Java集合中的泛型,是防止错误输入的,只在编译阶段有效,绕过编译机无效了
ArrayList list1 = new ArrayList();
ArrayList<String> list2 = new ArrayList<String>();
Class c1 = list1.getClass();
Class c2 = list2.getClass();
System.out.Println(c1 == c2);
打印出true,说明编译后集合的泛型是去泛型化的
3、验证
我们可以通过方法的反射来操作,绕过编译
Method m = c1.getMethod("add",Object.class);
m.invoke(list2,100);//绕过编译操作就绕过了泛型
System.out.println(list2.size());
打印出1,说明加进去了
此时就不能用foreach来遍历了,否则会报类型转换异常
查看全部 -
五、Java 方法反射的操作
1、如何获取某个方法
方法名称和方法参数列表才能唯一决定某个方法
先获取该类的类类型
A a1 = new A();
Class c = a1.getClass();
再通过类类型获取具体的方法
c.getMethod("print",int.class,int.class);
c.getMethod("print",new Object[]{int.class,int.class});
2、方法反射的操作
Object obj = method.invoke(对象,参数列表);
Object obj = m.invoke(a1,10,20);
Object obj = m.invoke(a1,new Object[]{10,20});
如果该方法没有返回值,则返回null,如果有返回值则返回具体的值
查看全部 -
四、Java获取成员变量构造函数的信息
1、成员变量也是对象
是java.lang.reflect.Field的对象
Field类封装了关于成员变量的操作
getFields()方法获取的是所有的public的成员变量
getDeclaredField()方法获取的是所有自己声明的成员变量
field.getType()得到成员变量的类型的类类型
field.getName()得到成员变量的名称
2、构造函数也是对象
是java.lang.reflect.Constructor的对象
getConstructors()获取所有的Public的构造函数
getDeclaredConstructors()获取所有的构造函数,构造方法必须是自己声明的
constructor.getParameterTypes()得到构造函数的参数列表(参数列表的类类型)
当一个类中没有定义构造函数时,系统会给该类中加一个默认的空参数的构造函数,方便该类初始化。只是该空构造函数是隐藏不见的。当在该类中自定义了构造函数,默认构造函数就没有了。
构造函数不能继承,因为子类继承父类的时候,先运行父类构造函数;具体的说就是运行父类时就会先“调用”父类的构造函数,注意“调用”和继承不是一个含义,实质上是“自动运行”。
查看全部 -
三、Java获取方法信息
1、基本数据类型 void关键字 都存在类类型
2、Class类的基本API操作
打印类的所有方法
查看全部 -
二、Java动态加载
1、Class.forName("类的全称");
不仅表示了类的类类型,还代表了动态加载类
请区分编译、运行
编译时刻加载类是静态加载、运行时刻加载类是动态加载
2、静态加载
new 创建对象 是静态加载类,在编译时刻就需要加载所有可能使用到的类
查看全部 -
可以写一个接口,接口里面写动态加载类的方法。以后要用到的每一个类都可以直接调用接口。查看全部
-
Class类的使用
通过类的累类型创建该类的对象实例。
Class c1 = Foo.Class();
或者
Class c2 = foo1.getClass();
或者
Class c3 = null;
try{
c3 = Class.ForName("com.namespace.classname");
}catch(ClassNotFoundException e){
}
classname c = (classname)c1.newInstance();
查看全部 -
//反射中获取类名称方式两种
a.getName();//获取全称(带报名,关键字除外)
a.getSimpleName(); //不带包名的类名称
//获取类型的方法
a.getMethods(); //获取类型所有public的函数,包括父类继承的函数
a.getDeclaredMethods() //获取类自己声明的方法,不包括父类的
a.getMethod("test"); //获取类中指定的方法名称
查看全部 -
New是静态加载类,在编译时刻就要加载所有可能用到的类查看全部
-
编译时刻加载类是静态加载类,运行时刻加载类是动态加载类查看全部
-
Java中集合的泛型,是防止输入错误的,只在编译阶段有效,编译之后就无效了!
查看全部 -
1、成员变量也是对象,是在java.lang.reflect.Field类,封装了关于成员变量的操作
Field[] fs = c.getFields();//获取的是public的成员变量信息 Field[] fs = c.getDeclaredFields();//获取的是该类自己声明的成员变量的信息
2、构造函数也是对象,java.lang.Constructor中封装了构造函数的信息。
Constructor[] cs = c.getConstructors//获取所有的public的构造函数 Constructor[] cs = c.gerDeclaredConstructors()//得到所有的构造函数
注:
c.getInterfaces()//得到接口 c.getModifiers()//得到访问权限 c.getPackage()//得到包名 c.getResource()//得到返回值 c.getSuperclass()//得到父类
想要的到类的信息,就必须先得到类的类类型
Class c = Object.getClass();
查看全部 -
方法也是对象,方法是Method[]的对象
Method[] ms = c.getMethods();//or c.getDeclaredMethods()
Method类,方法对象
一个成员就是一个Method对象
getMedhods()方法取得是所有的public函数,包括父类继承而来的
getDeclaredMethods()获取的是所有该类自己声明的方法,不问访问权限
for(int i = 0;i<ms.length;i++){ //得到方法的返回值类型的类类型 Class returnType = ms[i].getReturnType(); System.out.print(returnType.getName()+" "); //得到方法的名称 System.out.print(ms[i].getName()+"("); //获取参数类型-->得到的是参数类表的类型的类类型 Class[] paramType = ms[i].getParameterTypes(); for(Class c1:paramType){ System.out.print(c1.getName()+","); } System.out.print(")"); }
查看全部 -
1、什么是动态加载?什么是静态加载?
编译时刻加载类是静态加载类,运行时刻加载类是动态加载类
静态加载类:new 创建对象。是静态加载类,在编译时刻就需要加载所有的可能使用到的类
通过动态加载类可以解决上述问题
动态加载类:
Class c = Class.forName(args[0]); 功能接口 name = (功能接口 )c.newInstanc(); name.方法();
查看全部 -
Class.forName("类全称")实现运行时的动态加载类
查看全部
举报