JAVA-基础(Class对象及反射)
1.(1)什么是class对象?
首先,java有两种对象,第一种是实例对象,第二种是Class对象,每一个类运行的类型信息就是用Class对象表示的,每一个对象都有一个到java.lang.Class(用于描述对象的结构)的实例的引用。Class类没有公共的构造方法,Class对象是在类加载的时候由Java虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的,因此不能显式地声明一个Class对象。
(2)什么是反射?
Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。而这也是Java被视为动态(或准动态,为啥要说是准动态,因为一般而言的动态语言定义是程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。)语言的一个关键性质。
2.创建一个对象的过程?
我们在编写完java代码后会交给javac进行编译生成.class文件,当我们在某个java代码中调用这个对象时,java会调用ClassLoader类加载器,将这个class文件加载成为一个Class类对象,这个对象中的成员变量,构造方法,成员方法都是用数组将他们装起来,(编译器提示方法代码大多就是这个原理),然后会创建成为一个实例对象。
3.获取Class对象的方式?
(1)Class.forName(“全类名”):将字节码文件加载进内存,返回Class对象。
多用于配置文件,将类名定义在配置文件中,读取文件,加载类。
(2)类名.class:通过类名的属性class获取。
多用于参数的传递。
(3)对象.getClass():getclass方法在object类中定义。
多用与对象的获取字节码的方式。
同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,无论通过哪一种方式获取的class对象都是一个。
1 packagecn;2
3 importcn.entity.Persion;4
5 public classcalss09 {6 public static void main(String[] args) throwsClassNotFoundException {7 Class aClass = Class.forName("cn.entity.Persion");8 Class bClass = Persion.class;9 Persion persion = newPersion();10 Class cClass =persion.getClass();11 Persion persion1= newPersion();12 Class dClass =persion.getClass();13 persion1.getClass();14 System.out.println(persion==persion1);15 System.out.println(aClass==bClass);16 System.out.println(aClass==dClass);17 System.out.println(aClass==cClass);18 System.out.println(cClass==dClass);19 }20 }
View Code
4.Class对象的方法?
1 packagecn.entity;2
3 public classPersion {4 publicString name;5 private intage;6
7 public Persion(String name, intage) {8 this.name =name;9 this.age =age;10 }11
12 publicPersion() {13 }14
15 publicString getName() {16 returnname;17 }18
19 public voidsetName(String name) {20 this.name =name;21 }22
23 public intgetAge() {24 returnage;25 }26
27 public void setAge(intage) {28 this.age =age;29 }30
31 @Override32 publicString toString() {33 return "Persion{" +
34 "name='" + name + '\'' +
35 ", age=" + age +
36 '}';37 }38
39 public voideat(){40 System.out.println("eat....");41 }42 public voidhello(String a){43 System.out.println("say"+a);44 }45 }
View Code
在反射面前,没有什么私有共有之分。
1 packagecn;2
3 importcn.entity.Persion;4
5 importjava.lang.reflect.Field;6
7 public classcalss10 {8 public static void main(String[] args) throwsNoSuchFieldException, IllegalAccessException {9 Class p = Persion.class;10 Field[] fields =p.getFields();11 for(Field file:fields) {12 System.out.println(file);13 }14 System.out.println("-------------------------");15 Field field = p.getField("name");16 Persion persion = newPersion();17 Object name =field.get(persion);18 System.out.println(name);19 field.set(persion,"zhangsan");20 System.out.println(persion);21 //获取所有成员变量,不考虑修饰符
22 Field[] declaredFields =p.getDeclaredFields();23 for(Field field1:declaredFields) {24 System.out.println(field1);25 }26 System.out.println("-------------------------");27 Field field1 = p.getDeclaredField("age");28 field1.setAccessible(true);//暴力反射
29 Persion persion1 =newPersion();30 Object o =field1.get(persion1);31 System.out.println(o);32 }33 }
View Code
运行结果:
构造方法
1 packagecn;2
3 importcn.entity.Persion;4
5 importjava.lang.reflect.Constructor;6 importjava.lang.reflect.InvocationTargetException;7
8 public classcalss11 {9 public static void main(String[] args) throwsNoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {10 //构造器
11 Class persionClass = Persion.class;12 Constructor constructor = persionClass.getConstructor(String.class, int.class);13 System.out.println(constructor);14 Persion persion = newPersion();15 //用构造方法创建一个对象
16 Object asd = constructor.newInstance("asd", 10);17 System.out.println(asd);18 //空参构造方法创建对象
19 Object o =persionClass.newInstance();20 System.out.println(o);21 }22 }
View Code
运行结果:
方法:
1 packagecn;2
3 importcn.entity.Persion;4
5 importjava.lang.reflect.InvocationTargetException;6 importjava.lang.reflect.Method;7
8 public classcalss12 {9 public static void main(String[] args) throwsNoSuchMethodException, InvocationTargetException, IllegalAccessException {10 //方法
11 Class persionClass = Persion.class;12
13 Method method = persionClass.getMethod("eat");14 Persion persion = newPersion();15 //执行方法
16 method.invoke(persion);17 System.out.println("----------------");18 Method hello = persionClass.getMethod("hello", String.class);19 hello.invoke(persion,"hello");20 }21 }
View Code
做一个小反射框架
要求创建任意对象执行任意方法
(1)创建一个pro.properties
className=cn.it.entity.Persion
methodName=eat
(2)创建Persion类
1 packagecn.it.entity;2
3 public classPersion {4 publicString name;5 private intage;6
7 public Persion(String name, intage) {8 this.name =name;9 this.age =age;10 }11
12 publicPersion() {13 }14
15 publicString getName() {16 returnname;17 }18
19 public voidsetName(String name) {20 this.name =name;21 }22
23 public intgetAge() {24 returnage;25 }26
27 public void setAge(intage) {28 this.age =age;29 }30
31 @Override32 publicString toString() {33 return "Persion{" +
34 "name='" + name + '\'' +
35 ", age=" + age +
36 '}';37 }38
39 public voideat(){40 System.out.println("eat....");41 }42 public voidhello(String a){43 System.out.println("say"+a);44 }45 }
View Code
(3)反射
1 packagecn.it.domain;2
3
4 importjava.io.IOException;5 importjava.io.InputStream;6 importjava.lang.reflect.InvocationTargetException;7 importjava.lang.reflect.Method;8 importjava.util.Properties;9
10 public classcalss13 {11 public static void main(String[] args) throwsIllegalAccessException, InstantiationException, IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException {12 //获取class目录下的配置文件13 //加载配置文件,转化为一个集合
14 Properties properties= newProperties();15 ClassLoader classLoader = calss13.class.getClassLoader();16 InputStream resourceAsStream = classLoader.getResourceAsStream("cn/it/pro.properties");17 properties.load(resourceAsStream);18
19 String className = properties.getProperty("className");20 String methodName = properties.getProperty("methodName");21 Class aClass =Class.forName(className);22 Object o =aClass.newInstance();23 Method eat = aClass.getMethod("eat");24 eat.invoke(o);25
26 }27 }
View Code
中间写因为路径问题一直空指针,很郁闷所以把项目样子发一下