JAVA-基础(Class对象及反射)

news/2024/7/5 3:45:00

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 package cn;
 2 
 3 import cn.entity.Persion;
 4 
 5 public class calss09 {
 6     public static void main(String[] args) throws ClassNotFoundException {
 7         Class aClass = Class.forName("cn.entity.Persion");
 8         Class bClass = Persion.class;
 9         Persion persion = new Persion();
10         Class cClass =  persion.getClass();
11         Persion persion1= new Persion();
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 package cn.entity;
 2 
 3 public class Persion {
 4     public String name;
 5     private int age;
 6 
 7     public Persion(String name, int age) {
 8         this.name = name;
 9         this.age = age;
10     }
11 
12     public Persion() {
13     }
14 
15     public String getName() {
16         return name;
17     }
18 
19     public void setName(String name) {
20         this.name = name;
21     }
22 
23     public int getAge() {
24         return age;
25     }
26 
27     public void setAge(int age) {
28         this.age = age;
29     }
30 
31     @Override
32     public String toString() {
33         return "Persion{" +
34                 "name='" + name + '\'' +
35                 ", age=" + age +
36                 '}';
37     }
38 
39     public void eat(){
40         System.out.println("eat....");
41     }
42     public void hello(String a){
43         System.out.println("say"+  a);
44     }
45 }
View Code

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

 1 package cn;
 2 
 3 import cn.entity.Persion;
 4 
 5 import java.lang.reflect.Field;
 6 
 7 public class calss10 {
 8     public static void main(String[] args) throws NoSuchFieldException, 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  = new Persion();
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 =new Persion();
30         Object o = field1.get(persion1);
31         System.out.println(o);
32     }
33 }
View Code

运行结果:

构造方法

 1 package cn;
 2 
 3 import cn.entity.Persion;
 4 
 5 import java.lang.reflect.Constructor;
 6 import java.lang.reflect.InvocationTargetException;
 7 
 8 public class calss11 {
 9     public static void main(String[] args) throws NoSuchMethodException, 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 = new Persion();
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 package cn;
 2 
 3 import cn.entity.Persion;
 4 
 5 import java.lang.reflect.InvocationTargetException;
 6 import java.lang.reflect.Method;
 7 
 8 public class calss12 {
 9     public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
10         //方法
11         Class<Persion> persionClass = Persion.class;
12 
13         Method method = persionClass.getMethod("eat");
14         Persion persion = new Persion();
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 package cn.it.entity;
 2 
 3 public class Persion {
 4     public String name;
 5     private int age;
 6 
 7     public Persion(String name, int age) {
 8         this.name = name;
 9         this.age = age;
10     }
11 
12     public Persion() {
13     }
14 
15     public String getName() {
16         return name;
17     }
18 
19     public void setName(String name) {
20         this.name = name;
21     }
22 
23     public int getAge() {
24         return age;
25     }
26 
27     public void setAge(int age) {
28         this.age = age;
29     }
30 
31     @Override
32     public String toString() {
33         return "Persion{" +
34                 "name='" + name + '\'' +
35                 ", age=" + age +
36                 '}';
37     }
38 
39     public void eat(){
40         System.out.println("eat....");
41     }
42     public void hello(String a){
43         System.out.println("say"+  a);
44     }
45 }
View Code

(3)反射

 1 package cn.it.domain;
 2 
 3 
 4 import java.io.IOException;
 5 import java.io.InputStream;
 6 import java.lang.reflect.InvocationTargetException;
 7 import java.lang.reflect.Method;
 8 import java.util.Properties;
 9 
10 public class calss13 {
11     public static void main(String[] args) throws IllegalAccessException, InstantiationException, IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException {
12         //获取class目录下的配置文件
13         //加载配置文件,转化为一个集合
14         Properties properties=   new Properties();
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

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

 

转载于:https://www.cnblogs.com/fan123yh/p/11100170.html


http://lihuaxi.xjx100.cn/news/243529.html

相关文章

女生参加UI设计培训班有没有前途

在这个用户至上的时代&#xff0c;企业对于用户体验的关注度越来越高&#xff0c;很多职业都随之重视起来&#xff0c;尤其是UI设计岗位&#xff0c;很多女性都想学习UI设计&#xff0c;那么女生参加UI设计培训班有没有前途呢?我们来看看下面的详细介绍。 UI设计工作方向&…

day20 文件上传下载

2019独角兽企业重金招聘Python工程师标准>>> 文件上传基础及api解析&#xff1a; 文件上传最终版&#xff1a; 文件下载&#xff1a; 转载于:https://my.oschina.net/u/2356966/blog/648774

051 日志案例分析(PV,UV),以及动态分区

1.实现的流程 需求分析 时间&#xff1a;日&#xff0c;时段 分区表&#xff1a;两级 PV UV 数据清洗 2015-08-28 18&#xff1a;19&#xff1a;10 字段&#xff1a;id,url,guid,tracktime 数据分析 导出 2.新建源数据库 3.新建表 4.加载原始数据 5.查看部分结果 6.建立清洗数据…

自制绘图之坐标轴

写代码之前得先了解坐标轴的一些属性&#xff0c;坐标轴有范围&#xff0c;每隔多少显示一条数值信息。然而间隔信息有时并不确定&#xff0c;一旦设置不准确&#xff0c;图形会乱掉。最好的方法是使用另一个参数&#xff1a;分隔符总数。这样可以利用坐标范围计算出间隔。 首先…

Java培训好不好?零基础可以学吗?

5g时代的来临&#xff0c;越来越多的人开启智能时代&#xff0c;互联网行业的发展速度越来越快&#xff0c;高薪行业一直受到很多人的关注&#xff0c;尤其是java这一块&#xff0c;很多人都想学习&#xff0c;那么参加Java培训好不好?零基础可以学吗? Java培训好不好?零基础…

史上最全的“大数据”学习资源

2019独角兽企业重金招聘Python工程师标准>>> 资源列表&#xff1a; 关系数据库管理系统&#xff08;RDBMS&#xff09; 框架 分布式编程 分布式文件系统 文件数据模型 Key -Map 数据模型 键-值数据模型 图形数据模型 NewSQL数据库 列式数据库 时间序列数据…

《Linux内核设计与实现》读书笔记 第三章 进程管理

第三章进程管理 进程是Unix操作系统抽象概念中最基本的一种。我们拥有操作系统就是为了运行用户程序&#xff0c;因此&#xff0c;进程管理就是所有操作系统的心脏所在。 3.1进程 概念&#xff1a; 进程&#xff1a;处于执行期的程序。但不仅局限于程序&#xff0c;还包含其他资…

SDK开发日积月累(二)

WM_NOTIFY消息和WM_COMMAND消息在一个对话框中&#xff0c;子控件可以有两种方式与父对话框通信。1.向父对话框发送WM_COMMAND消息&#xff0c;但这种消息传递的信息量比较少。2.向父对话框发送WM_NOTIFY消息&#xff0c;信息量比较大。idCtrl (int) wParam; pnmh (LPNMHDR) …