当前位置: 首页 > 编程日记 > 正文

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

我们在编写完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

相关文章:

当年学生的一件事,心情很难过

当年学生的一件事&#xff0c;心情很难过 今天同一个以前的学生聊天&#xff0c;搞得心情很难过。那年是刚毕业&#xff0c;带了几个学生的毕业论文&#xff0c;其中有一个&#xff0c;只是第一次见过一面&#xff0c;最后答辩前见一两天以及答谢见过一面。他从来不同我联系&am…

while循环中,break,continue,return的差别

break 结束循环&#xff0c;跳出循环体&#xff1b;continue 结束本次循环。进行下次循环&#xff1b;return 跳出循环体所在的方法&#xff0c;相当于跳出循环体。

Strategy_Level2

以下代码是“策略模式”的第五个例子&#xff1a;

自制绘图之坐标轴

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

DotNET(C#) Socket基本编程 (1)

Socket基本编程 服务端&#xff1a; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; Thread mythread ; Socket socket; // 清理所有正在使用的资源。 protected override void Dispose( bool disposing ) { try {    socket.Clos…

CC2540 OSAL 学习其中原理,以及 给任务 添加 一个事件(定时发送串口消息)

参考学习大神博客&#xff1a; http://blog.csdn.net/feilusia/article/details/51083953 &#xff1a; http://blog.csdn.net/xiaoleiacmer/article/details/41723583 1、TI 的 CC2540跑了一个 OSAL (Operating System Abstraction Layer) 心得&#xff1a;大概 就是 一个循…

Strategy_Level3

以下代码是“策略模式”的第六个例子&#xff1a;

SDK开发日积月累(二)

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

关于IP地址的分类

我们说过因特网是把全世界的无数个网络连接起来的一个庞大的网间网&#xff0c;每个网络中的计算机通过其自身的IP地址而被唯一标识的&#xff0c;据此我们也可以设想&#xff0c;在INTERNET上这个庞大的网间网中&#xff0c;每个网络也有自己的标识符。这与我们日常生活中的电…

Visual Studio UML Activity Diagram(1)

数理系LSGO软件技术团队能够存活下来&#xff0c;并形成战斗力的根本原因&#xff0c;归结为我们的价值观。我们“只问收获&#xff0c;不问耕耘”&#xff0c;对知识是贪婪的&#xff0c;我们会把所学的知识放到场景中去应用&#xff0c;我们一定要做出成品。我们强调“要构建…

VMware 克隆Linux后找不到eth0

VMware 克隆Linux,ifconfig 不出现eth0解决方案:1)删除 /etc/udev/rules.d/70-persistent-net.rules/rm -rf /etc/udev/rules.d/70-persistent-net.rules2)重启init 6 3)ifconfig 查看转载于:https://blog.51cto.com/ictedu/1917185

笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)

议题&#xff1a;二分查找树性能分析&#xff08;Binary Search Tree Performance Analysis&#xff09; 分析&#xff1a; 二叉搜索树&#xff08;Binary Search Tree&#xff0c;BST&#xff09;是一颗典型的二叉树&#xff0c;同时任何节点的键值大于等于该节点左子树中的所…

定义自定义的异常

首先我们建立自己的异常类CustomException&#xff0c;它要继承自ApplicationException类&#xff08;这是一个在发生非致命的应用程序错误时抛出的通用异常&#xff0c;它又继承于更为通用的Exception类&#xff09;&#xff0c;将其用作为应用程序定义的任何自定义异常的基类…

python3 的 round 函数的 练习

python3 的 round 函数感觉很别扭&#xff0c;其运算结果与习惯不相符。特记录下来&#xff1a; 代码 python 3的 round 函数 是“四舍六入五成双”的https://www.zhihu.com/question/20128906print(python 3的 round 函数&#xff1a;四舍六入五成双)print(\nround(-3.5) , …

Visual Studio UML Activity Diagram(2)

昨天的图文介绍了Visual Studio UML Activity Diagram中所涉及的对象&#xff0c;今天图文我们来介绍这些对象的属性部分并给出UML关于Activity Diagram的元模型类图。通常情况下&#xff0c;我们在做一套软件系统的时候&#xff0c;对甲方业务流程并不熟悉&#xff0c;如果直接…

Go 语言中手动内存管理

2019独角兽企业重金招聘Python工程师标准>>> Go 语言是自带GC的, 相对C语言等的手动内存管理省事很多, 弊端便是会消耗更多的内存, 以及在GC时导致整个程序的停顿. 在某些特殊场合, 如果能够可选地手动进行内存管理, 效果会好不少. Go 目前的 GC 实现比较简单(mark-…

依赖倒转原则(Dependency Inversion Principle,DIP)

前面两篇图文介绍了“开闭原则”和“里氏替换原则”。开发出对扩展开放&#xff0c;对修改封闭的系统是程序员的目标&#xff0c;而今天所介绍的“依赖倒转原则”正是实现这一目标的途径之一&#xff0c;而“里氏替换原则”为这一途径提供了保证。大家或许发现&#xff0c;我写…

细说浏览器特性检测(2)-通用事件检测

在上一篇中介绍了jQuery1.4版本新增的几个浏览器特性检测方案和具体的目的&#xff0c;本文将以事件为中心&#xff0c;介绍一个较为完整、通用的事件检测方案。 事件检测&#xff0c;即检测某一事件在不同的浏览器中是否存在&#xff08;可用&#xff09;&#xff0c;这在编写…

robot简单功能测试脚本设计(例子)

以学生管理系统的添加一个学生信息为例子页面对象&#xff1a;editbox&#xff08;姓名&#xff09;,button&#xff08;添加&#xff09;数据要求&#xff1a;1 姓名不能为空2 姓名不能重复程序结构1 点button&#xff0c;弹出对话框“姓名不能为空”2 输入姓名&#xff0c;点…

里氏替换原则(Liskov Substitution Principle,LSP)

昨天图文介绍了软件设计的一个基本原则“开闭原则”&#xff0c;而“开闭原则”的核心就是通过抽象把需求变化进行隔离&#xff0c;这种想法可以通过“里氏替换原则”进行保证。理解“里氏替换原则”也是理解面向对象中“运行时多态”的关键。希望大家仔细体会。

在IIS7里配置 ISAPI,运行dll程序,总提示下载dll

在IIS7里配置 ISAPI&#xff0c;运行dll程序&#xff0c;总提示下载dll&#xff0c;只需要把对应站点应用程序池里面的高级设置里的启用32位应用程序&#xff0c;设为“true"即可。

MySQL数据库高可用集群搭建-PXC集群部署

Percona XtraDB Cluster&#xff08;下文简称PXC集群&#xff09;提供了MySQL高可用的一种实现方法。集群是有节点组成的&#xff0c;推荐配置至少3个节点&#xff0c;但是也可以运行在2个节点上。 PXC原理描述&#xff1a; 分布式系统的CAP理论&#xff1a; C&#xff1a;一致…

搭建Jupyter学习环境

python notebook是一个基于浏览器的python数据分析工具&#xff0c;使用起来非常方便&#xff0c;具有极强的交互方式和富文本的展示效果。jupyter是它的升级版&#xff0c;它的安装也非常方便&#xff0c;一般Anaconda安装包中会自带。安装好以后直接输入jupyter notebook便可…

[转贴]2006十大经典语句

1. 骑白马的不一定是王子&#xff0c;他可能是唐僧&#xff1b; 2. 带翅膀的也不一定是天使&#xff0c;他可能是鸟人。 3. 站的更高&#xff0c;尿的更远。 4. 穿别人的鞋&#xff0c;走自己的路&#xff0c;让他们找去吧&#xff0c; 5. 我不是随便的人。我随便起来不是人 6.…

开放-封闭原则(The Open-Closed Principle,OCP)

自己设计的软件系统“易于维护”、“扩展性好”、“可重用”、“具有灵活性”&#xff0c;这是每位程序员所追求的目标。“开闭原则”为我们指明了方向&#xff0c;即我们所设计的软件尽量满足“开闭原则–对扩展开放&#xff0c;对修改关闭”&#xff0c;这样就能降低需求不断…

Interesting visualization tools for profiling.

Interesting visualization tools for profiling. http://dtrace.org/blogs/brendan/2012/03/17/linux-kernel-performance-flame-graphs/ http://dtrace.org/blogs/brendan/2013/07/01/detecting-outliers/转载于:https://www.cnblogs.com/kungfupanda/p/3245651.html

javascript网页开发 第二章

HTML高级部分 2.1. 表格标签 2.1.1 <table></table> Bgcolor 设置表格的背景色 Border 设置边框的宽度 Bordercolor 设置边框的颜色 Bordercolorlight 设置边框明亮部分的颜色 Bordercolordark 设置边框昏暗部分的颜色 Cellspacing 设置单元格之间的间隔大小 Cel…

ORACLE JET BASIC TABLE

转载于:https://blog.51cto.com/feitai/1917581

Visual Studio UML Use Case Diagram(1)

前几天我们介绍了Visual Studio UML Activity Diagram&#xff0c;今天我们介绍Visual Studio UML Use Case Diagram的内容。通常RUP按照动态划分&#xff0c;分为周期、阶段、里程碑、迭代&#xff0c;按照静态划分&#xff0c;分为角色、制品、工作流、活动&#xff0c;在Wor…

可以左右移动多选下拉列表的javaScipt(可以兼容IE和firefox)

自己在项目业余时间总结了一份可以左右移动&#xff08;Add和remove&#xff09;多选下拉列表的javaScipt,可以兼容IE和firefox,并且经过测试&#xff0c;只是代码略显臃肿&#xff0c;希望各位网友参考后给一些指点&#xff0c;特别是在简化代码方面。我在让其兼容 firefox很是…