作为一个稀有的Java妹子,所写的所有博客都只是当作自己的笔记,留下证据自己之前是有用心学习的~哈哈哈哈(如果有不对的地方,也请大家指出,不要悄悄咪咪的不告诉我)
Class
1.Class和.class文件
Class是一个类,所有的Java类在项目启动后都会被jvm加载生成一个Class的实例对象,该对象保存在.class文件中,每个类只有一个Class对象,jvm通过该对象获取类的所有信息,通过new关键字创建对象实际上是通过Class反射得到的。
Java是解释型语言,启动后会把.java文件编译成.class文件,每个类都对应一个.class文件,使用反编译工具打开.class文件可以看到自己手动编写的类的所有信息,下图是我使用反编译工具打开一个jar包,打开其中一个.class文件的结果:

可以看出,jar包中是一些基础类和自己编写的类的.class文件的集合,有了.class文件,就可以实现一次编译,到处运行,因为jvm虚拟机会通过.class文件获取到类信息,通过反射可以执行类中方法。
2.三种方式获取Class实例对象
Class.forName(“类的全路径名”);
类名.class;
对象.getClass();
Class clazz1 = Class.forName("java.lang.String");
Class clazz2 = Object.class;
Object object = new Object();
Class clazz3 = object.getClass();
3.Class的常用方法
//获取指定方法名的方法
public Method getDeclaredMethod(String name, Class<?>... parameterTypes)
//获取所有的方法数组
public Method[] getDeclaredMethods()
//获取所有的公共方法
public Method[] getMethods()
//获取类的全路径名
public String getName()
//获取类名
public String getSimpleName()
//获取所有的属性数组
public Field[] getDeclaredFields()
//获取指定属性名的属性
public Field getDeclaredField(String name)
...还有很多get方法,不一一列举
//判断是否是接口
public native boolean isInterface()
//判断是否是注解类
public boolean isAnnotation()
接下来以下面这个StringDemo类为例子,说明各个方法的使用
public class StringDemo {
private String name;
public static void testIsEmpty(){
String str = "fr";
System.out.println(str.isEmpty());
}
public static void testCompare(){
String str = "1ABc23";
System.out.println("123".equals(str));
System.out.println(str.startsWith("1"));
System.out.println(str.endsWith("23"));
System.out.println(str.equalsIgnoreCase("1abc23"));
}
public void judgeUserIdentity(String type){
switch (EnumDemo.getValue(type)){
case COPPER:
doSomething0();break;
case SILVER:
doSomething1();break;
case GOLD:
doSomething2();break;
case PLATINUM:
doSomething3();break;
case DIAMOND:
doSomething4();break;
}
}
public void doSomething0(){
System.out.println("COPPER");
}
public void doSomething1(){
System.out.println("SILVER");
}
public void doSomething2(){
System.out.println("GOLD");
}
public void doSomething3(){
System.out.println("PLATINUM");
}
public void doSomething4(){
System.out.println("DIAMOND");
}
}
Class clazz =Class.forName("com.jdk_source_code.demo.util.StringDemo");
System.out.println(clazz.getName());//com.jdk_source_code.demo.util.StringDemo
System.out.println(clazz.getSimpleName());//StringDemo
Method method = clazz.getDeclaredMethod("judgeUserIdentity", String.class);
method.invoke(clazz.newInstance(),"COPPER");//COPPER
System.out.println(clazz.isInterface());//false
System.out.println(clazz.isAnnotation());//false
Method[] methods = clazz.getDeclaredMethods();
for(Method item:methods){
System.out.println(item);
}
/**
* public void com.jdk_source_code.demo.util.StringDemo.judgeUserIdentity(java.lang.String)
* public static void com.jdk_source_code.demo.util.StringDemo.testIsEmpty()
* public void com.jdk_source_code.demo.util.StringDemo.doSomething0()
* public void com.jdk_source_code.demo.util.StringDemo.doSomething1()
* public void com.jdk_source_code.demo.util.StringDemo.doSomething2()
* public static void com.jdk_source_code.demo.util.StringDemo.testCompare()
* public void com.jdk_source_code.demo.util.StringDemo.doSomething3()
* public void com.jdk_source_code.demo.util.StringDemo.doSomething4()
*/
1118

被折叠的 条评论
为什么被折叠?



