java 反射 对象_JAVA-基础(Class对象及反射)

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.创建一个对象的过程?

d5ebe58f5f3c75bde1a3aaecfe0f4af7.png

我们在编写完java代码后会交给javac进行编译生成.class文件,当我们在某个java代码中调用这个对象时,java会调用ClassLoader类加载器,将这个class文件加载成为一个Class类对象,这个对象中的成员变量,构造方法,成员方法都是用数组将他们装起来,(编译器提示方法代码大多就是这个原理),然后会创建成为一个实例对象。

3.获取Class对象的方式?

(1)Class.forName(“全类名”):将字节码文件加载进内存,返回Class对象。

多用于配置文件,将类名定义在配置文件中,读取文件,加载类。

(2)类名.class:通过类名的属性class获取。

多用于参数的传递。

(3)对象.getClass():getclass方法在object类中定义。

多用与对象的获取字节码的方式。

同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,无论通过哪一种方式获取的class对象都是一个。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

e6fcd54217fb4be527343f775d36b8a9.png

4.Class对象的方法?

f78cc7fafb8cdb6c2ce81fc8fbfd9c32.png

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

在反射面前,没有什么私有共有之分。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

运行结果:

9bff99178480be934013e253c41e5e13.png

构造方法

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

运行结果:

a2bb7049d56164c6c47d6d57dbe0134d.png

方法:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

2ee61783833c9cd56d8aef19653f2edd.png

做一个小反射框架

要求创建任意对象执行任意方法

(1)创建一个pro.properties

className=cn.it.entity.Persion

methodName=eat

(2)创建Persion类

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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)反射

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

中间写因为路径问题一直空指针,很郁闷所以把项目样子发一下

2a5d456db9915ecbe9dbd1bb2fa3830c.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值