一、class类的使用
- 1、java静态的成员、普通数据类型类不是对象
- 2、类是对象,类是java.lang.Class类的实例对象。这个类称为该类的类类型(class type)
- 3、只有java虚拟机可以创建class的实例对象
- 4、编译时加载类为静态加载类,运行时刻加载类是动态加载类。
--new创建对象是静态加载类,在编译时刻就需要加载所有的可能使用到的类。
--使用Class.forName("类全程");为动态加载类,在运行时刻加载 - 5、测试代码如下
public class ClassDemo {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
//Foo的实例化对象如何表示
Foo foo1 = new Foo(); //foo1即Foo的实例化对象
//Foo这个类也是一个实例化对象,是Class类的实例对象,即任何一个类都是Class的实例对象
//表示方式1 -- 即任何一个类都有一个隐含的静态成员变量class
Class class1 = Foo.class;
//表示方式2,已知该类的对象,通过getClass方法获得
Class class2 = foo1.getClass();
//class1 、class2 表示了Foo类的类类型(class type),class1=class2,即一个类只可能是Class类的一个实例对象
System.out.println( class1 == class2);
//表达方式3
Class class3 = Class.forName("com.tiandy.producer.Foo");
//class3 = class2 = class1
//通过class1、class2、class3创建Foo的实例
Foo foo2 = (Foo)class1.newInstance();//需要有无参数的构造方法
}
}
class Foo{}
测试代码2
public class MethodUtil {
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
//要获取print(int,int )方法
Abc abc = new Abc();
Class cla = abc.getClass();
//获取方法,getMethod:获取的事public方法;getDeclaredMethod自己声明的方法。以下两种方法均可。
// Method method = cla.getMethod("pring",new Class[]{int.class,int.class});
Method method1 = cla.getMethod("print",int.class,int.class);
Method method2 = cla.getMethod("print",String.class,String.class);
//方法的反射操作
Object o = method1.invoke(abc,10,20);
Object o1 = method2.invoke(abc,"10","20");
System.out.println();
}
}
class Abc {
public void print(int a,int b){
System.out.println(a+b);
}
public void print(String a,String b){
System.out.println(a+b);
}
}
二、方法的反射
- 1、方法的名称和方法的参数列表才能唯一决定某个方法
- 2、方法的反射操作:method.invoke(对象,参数列表)
public class MethodUtil {
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
//要获取print(int,int )方法
Abc abc = new Abc();
Class cla = abc.getClass();
//获取方法,getMethod:获取的事public方法;getDeclaredMethod自己声明的方法。以下两种方法均可。
// Method method = cla.getMethod("pring",new Class[]{int.class,int.class});
Method method1 = cla.getMethod("print",int.class,int.class);
Method method2 = cla.getMethod("print",String.class,String.class);
//方法的反射操作
Object o = method1.invoke(abc,10,20);
Object o1 = method2.invoke(abc,"10","20");
System.out.println();
}
}
class Abc {
public void print(int a,int b){
System.out.println(a+b);
}
public void print(String a,String b){
System.out.println(a+b);
}
}
三、泛型的本质
- 1.泛型只在编译时有用,用于防止代码输入错误。运行时去掉。
网友评论