public class demo04 { public static void main(String[] args) throws ClassNotFoundException { Person person = new student(); System.out.println(person.name);
//方式一 :通过对象获得 Class c1 = person.getClass(); System.out.println(c1.hashCode());
//方法二:forName 获得 Class c2 = Class.forName("opp2.student"); System.out.println(c2.hashCode());
//方法三: 类名.class获得 Class c3 = student.class; System.out.println(c3.hashCode());
//方法四 基本内置类型的包装类都有一个Type属性 Class c4 = Integer.TYPE; System.out.println(c4);
//方法五:获得父类类型 Class c5 = c1.getSuperclass(); System.out.println(c5); } }
class Person{ String name; public Person(){}
public Person(String name) { this.name = name; }
@Override public String toString() { return "Person{" + "name='" + name + ''' + '}'; } } class student extends Person{ public student(){ this.name = "学生"; } }
class teacher extends Person{ public teacher(String name) { this.name = "老师"; } }
所有类型的Class对象
class:外部类、成员(内部成员、外部成员),局部内部类,匿名内部类
interface:接口
[] :数组
enum:枚举
annotation:注解@interface
primitive type:基本数据类型
void
package opp2;
import javax.xml.bind.Element;
public class demo { public static void main(String[] args) { Class c1 = Object.class; //类 Class c2 = Comparable.class; //接口 Class c3 = String[].class; //一维数组 Class c4 = int[][].class; //二维数组 Class c5 = Override.class; //注解 Class c6 = Element.class; //枚举 Class c7 = Integer.class; //基本数据类型 Class c8 = void.class; //void Class c9 = Class.class; //Class
int[] a = new int[10]; int[] b = new int[100]; System.out.println(a.getClass().hashCode()); System.out.println(b.getClass().hashCode()); //只要元素类型与维度一样,就是同一个class } }
类加载内存分析
加载------>链接---->初始化
package opp2;
public class demo06 { public static void main(String[] args) { A a = new A(); System.out.println(a.m); /** * 1.【加载】到内存,会产生一个类对应的Class对象 * 2.【链接】,链接后, m = 0 * 3.【初始化】: * <clint>(){ * system.out.println("A类的静态代码块初始化"); * m = 300; * m = 100; * } */ } }
class A{ static { System.out.println("A类的静态代码块"); m = 300; }
/** * m = 300 * ↓ * m = 100 */ static int m = 100; public A(){ System.out.println("A类的无参构造初始化"); } }
分析类初始化
类的主动引用(一定会发生初始化)
类的被动引用(不会发生类的初始化)
package opp2;
public class demo07 {
static { System.out.println("main类被加载"); }
public static void main(String[] args) throws ClassNotFoundException { //1. 主动引用 S s = new S(); //反射也会主动引用 Class.forName("opp.demo07.S");
public class demo11 { public static void test1(){ User user = new User(); long startTime = System.currentTimeMillis(); for (int i = 0; i < 1000000000; i++) { user.getName(); } long endTime = System.currentTimeMillis(); System.out.println("普通方法执行10亿次 " + (endTime-startTime)+"ms"); }
public static void test2() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { User user = new User(); Class c1 = user.getClass(); Method getName = c1.getDeclaredMethod("getName", null); long startTime = System.currentTimeMillis(); for (int i = 0; i < 1000000000; i++) { getName.invoke(user,null); } long endTime = System.currentTimeMillis(); System.out.println("映射方法执行10亿次 " + (endTime-startTime) +"ms"); }
public static void test3() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { User user = new User(); Class c1 = user.getClass(); Method getName = c1.getDeclaredMethod("getName", null); getName.setAccessible(true);
long startTime = System.currentTimeMillis(); for (int i = 0; i < 1000000000; i++) { getName.invoke(user,null); } long endTime = System.currentTimeMillis(); System.out.println("普通方法执行10亿次 " + (endTime-startTime)+"ms"); }
/** * 练习反射操作注解 */ public class demo13 { public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException { Class<?> c1 = Class.forName("opp2.Student2"); Annotation[] annotation = c1.getAnnotations();
//通过反射获得注解 for (Annotation annotation1:annotation){ System.out.println(annotation1); }
//获得注解的value值 TableM tableM = c1.getAnnotation(TableM.class); String value = tableM.value(); System.out.println(value);
//获得类指定的注解 // Field name = c1.getDeclaredField("name"); Field name = c1.getDeclaredField("id"); Fk annotation1 = name.getAnnotation(Fk.class); System.out.println(annotation1.columnName()); System.out.println(annotation1.Type()); System.out.println(annotation1.length());
} }
@TableM("db_student") class Student2{ @Fk(columnName = "db_id",Type = "int", length = 10) private int id; @Fk(columnName = "db_age",Type = "int", length = 10) private int age; @Fk(columnName = "db_name", Type = "varchar", length = 3) private String name; public Student2(){
}
public Student2(int id, int age, String name) { this.id = id; this.age = age; this.name = name; }
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
@Override public String toString() { return "Student2{" + "id=" + id + ", age=" + age + ", name='" + name + ''' + '}'; } }