-
泛型只在编译阶段起作用,是为了防止错误输入 通过方法的反射可以绕过编译,绕过泛型查看全部
-
方法的反射查看全部
-
获取构造方法查看全部
-
获取成员变量的信息查看全部
-
葵查看全部
-
咯哦哦查看全部
-
方法的反射: 1.获取A类中的print(int,int)方法: ①要获取一个方法就是获取类的信息,获取类的信息首先要获取类的类类型 A a1=new A(); Class c= a1.getClass(); ②获取方法 由名称和参数列表来决定,getMethod获取的是public方法,getDelcaredMethod获取自己声明的方法 Method m =c.getMethod(methodName,paramtypes);//paramtypes可以用数组的形式 表示new Class[]{int.class,int.class},也可以直接列举类类型 2.方法的反射操作:是用m对象来进行方法调用,和a1.print(10,20)调用的方法相同 m.invoke(a1,new Object[]{10,20}) Object o=m.invoke(对象名,参数);//方法如果没有返回值返回null,如果有返回值返回具体值,参数可用数组的方式表示,也可以直接列举,没有参数就不写 public Class A{ public void print(){}; public void Print(Sting a,String b){} public void Print(int a,int b){}; } public Class B{ public static void main(String[] args){ A a1 = new A(); Class c= a1.getclass; Method getMet=c.getMethod("print",String.class,String.class); Object obj=getMet.invoke(a1,"df","df"); } }查看全部
-
要获取类的信息,先获取类的类类型,即Class c = obj.getClass(); 1.成员变量也是对象,Java.lang.reflect.Field Field类封装了关于成员变量的操作 2.Field[]gs=c.getFields();获取的是所有public的成员变量的信息,getDeclaredFields()获取的是该类自己声明的成员变量的信息 3.Class fieldType=field.getType();得到成员变量的类型的类类型;String fieldname=field.getName();得到成员变量的名称 4.构造函数也是对象,java.lang.Constructor中封装了构造函数的信息,getConstructor()获取所有的public的构造函数,getDeclaredConstructor()得到所有的构造函数(必须是自己声明的) 5.Class[]paramTypes=constructor.getParameterTypes();获取构造函数的参数列表--->得到的是参数列表类型的类类型;查看全部
-
Class c1 = int.class; // int基本类型的类类型 Class c2 = String.class; // String类的类类型 c1.getName(); // 返回int c2.getName(); // 返回java.lang.String c2.getSimpleName(); // 返回String Methods[] ms = c1.getMethods(); // 获取该类的所有公有方法,包括继承的方法 Methods[] ms = c1.getDeclaredMethods(); / 获取所有自己声明的方法,包括私有方法 for(int i=0;i<ms.length;i++){ Class returnType = ms[i].getReturnType; // 获取这个方法的返回值的类类型 returnType.getName(); // 该方法的返回值的类类型的名称 ms[i].getName(); // 该方法的名称 Class[] paramTypes = ms[i].getParameterType(); // 获取该方法的参数的类型的类类型的数组 for(Class class1: paramType){ class1.getName(); // 获取该参数的类型的名称 } }查看全部
-
new创建对象是静态加载类,在编译时进行加载,如果程序中其他的类有问题,那么没有问题的类也是无法执行的 解决这个问题可以使用动态加载 Word w=new Word();静态加载 Class c=Class.forName(类的绝对路径);动态加载 c叫做类的类类型,也可以通过类类型创建实例 c.newInstance(); 功能性的类最好使用动态加载,而不是静态加载。动态加载类指的是程序运行时加载类,而静态加载指的是编译时加载类,编译时加载的缺点是程序中所有的功能都不能有差错,否则的话程序就不能用了,而动态加载类的好处就是我们需要使用哪一个类虚拟机就会动态加载根据我们的需要动态的加载这个类,这样程序的使用就不会受到其他的影响查看全部
-
普通数据类型,静态的成员不是面向对象 类是对象,类是java.lang.Class类的实例对象 任何一个类都是Class的实例对象,这个实例对象的官方叫法也可以叫做我们写的class的类类型,这个类类型有三种表示方式: 1.Class c= Foo.class; 2.Class c = foo1.getClass();已知Foo类的实例对象foo1; 3.Class c= Class.forName("com.imooc.reflect.Foo");括号里面是类的全称 一个类只可能是Class类的实例对象. 我们可以用这个类类型来new一个该类的实例对象,同样也可以调用这个里面的方法,前提是这个类里面要有一个无参的构造方法。例如:A a=(A)c.newInstance();查看全部
-
反射操作 绕过编译 运行时操作查看全部
-
三种获得类类型的方法 class表示类,object表示该类的对象, Class c=class.class; Class c=object.getClass(); Class c=Class.forName(class类的绝对路径);查看全部
-
new创建对象是静态加载类,在编译时进行加载,如果程序中其他的类有问题,那么没有问题的类也是无法执行的 解决这个问题可以使用动态加载 Word w=new Word();静态加载 Class c=Class.forName(类的绝对路径);动态加载 c叫做类的类类型,也可以通过类类型创建实例 c.newInstance();查看全部
-
class对象三种获取方式 1.Class c1= A.class; 2.Class c2=a.getClass() 3.Class c3 = forNameClass(pakcage.A) 反射机制是在编译后的 所以可以绕过标准 所有的new 对象都是静态编译过程,就是必须编译时会检查 invoke方法是反射操作的核心 Mothed m = c1.getMethod(方法名 ,参数列表) m.invoke(代理的对象, 参数)查看全部
举报
0/150
提交
取消