1.    写出获取Class实例的三种常见方式获取Class类对象(实例)的三种方式- 类名.class属性Class<Student> c1 = Student.class;- 对象名.getClass()方法Student s = new Student();Class<? extends Student> c3 = s.getClass();- Class.forName(全类名)方法Class<?> c4 = Class.forName("com.itheima_02.Student");2.    谈谈你对Class类的理解1.类的加载过程:程序经过javac.exe命令以后,会生成一个或多个字节码文件(.class结尾)。接着我们使用java.exe命令对某个字节码文件进行解释运行。相当于将某个字节码文件加载到内存中。此过程就称为类的加载。加载到内存中的类,我们就称为运行时类,此运行时类,就作为Class的一个实例。2.换句话说,Class的实例就对应着一个运行时类。3.加载到内存中的运行时类,会缓存一定的时间。在此时间之内,我们可以通过不同的方式来获取此运行时类。

反射

反射就是把Java类中的各种成分映射成相应的java类。例如,一个Java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息也用一个个的Java类来表示,就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类。表示Java类的Class类显示要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,它们是Field、Method、Contructor、Package等等。

一个类中的每个成员都可以用相应的反射API类的一个实例对象来表示,通过调用Class类的方法可以的得到这些实例对象

3. 利用反射和重载完成以下功能
1)创建Student类,类中有属性name和age并封装属性
2)重载Student的构造函数,一个是无参构造并,另一个是带两个参数的有参构造,要求在构造函数打印提示信息 
3)创建带main函数的NewInstanceTest类,利用Class类得到Student对象
4)通过上述获取的Class对象分别调用Student有参函数和无参函数

a. 使用对象名.getClass()方法 获取class实例

打印出来的是存储地址

代码和 打印结果:

package com.B.Reflect_15.Ask_03;import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;public class Test {public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, ClassNotFoundException {
//3)创建带main函数的NewInstanceTest类,利用Class类得到Student对象// a.-对象名.getClass()方法 获取class实例Student s1 = new Student();Class<? extends Student> c = s1.getClass();//       此乃提示信息!
//com.B.Reflect_15.Ask_03.Student@6bdf28bb
//----------
//com.B.Reflect_15.Ask_03.Student@6b71769e
//
//进程已结束,退出代码 0
///        4)通过上述获取的Class对象分别调用Student有参函数和无参函数
//调用无参函数并创建对象objConstructor<?> constructor = c.getConstructor();Object obj = constructor.newInstance();//调用带参函数并创建对象obj1Constructor<?> constructor1 = c.getConstructor(String.class, int.class);Object obj1 = constructor1.newInstance("知谓忧",22);System.out.println(obj);System.out.println("----------");System.out.println(obj1);}
}
此乃提示信息!
com.B.Reflect_15.Ask_03.Student@6bdf28bb
----------
com.B.Reflect_15.Ask_03.Student@6b71769e进程已结束,退出代码 0
  b.- Class.forName(全类名)方法  获取class实例

打印出来依旧是地址

package com.B.Reflect_15.Ask_03;import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;public class Test {public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, ClassNotFoundException {
//3)创建带main函数的NewInstanceTest类,利用Class类得到Student对象//        b.- Class.forName(全类名)方法  获取class实例Class<?> c1 = Class.forName("com.B.Reflect_15.Ask_03.Student");//        4)通过上述获取的Class对象分别调用Student有参函数和无参函数
//调用无参函数并创建对象objConstructor<?> constructor = c1.getConstructor();Object obj = constructor.newInstance();//调用带参函数并创建对象obj1Constructor<?> constructor1 = c1.getConstructor(String.class, int.class);Object obj1 = constructor1.newInstance("知谓忧",22);System.out.println(obj);System.out.println("----------");System.out.println(obj1);}
}
此乃提示信息!
com.B.Reflect_15.Ask_03.Student@6bdf28bb
----------
com.B.Reflect_15.Ask_03.Student@6b71769e进程已结束,退出代码 
  1. 利用通过反射修改私有成员变量

    1. 定义PrivateTest类,有私有name属性,并且属性值为hellokitty,只提供name的getName的公有方法

    2. 创建带有main方法ReflectTest的类,利用Class类得到私有的name属性

    3. 修改私有的name属性值,并调用getName()的方法打印name属性值

代码:

package com.B.Reflect_15.Ask_01;
//1.    定义PrivateTest类,有私有name属性,并且属性值为hellokitty,只提供name的getName的公有方法
public class PrivateTest {private String name = "hellokitty";public PrivateTest() {}public PrivateTest(String name) {this.name = name;}public String getName() {return name;}
}package com.B.Reflect_15.Ask_01;import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;//2. 创建带有main方法ReflectTest的类,利用Class类得到私有的name属性
public class ReflectTest {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
//- Class.forName(全类名)方法  获取class实例对象Class<?> c = Class.forName("com.B.Reflect_15.Ask_01.PrivateTest");// 3.   修改私有的name属性值,并调用getName()的方法打印name属性值//创建运行时类的对象PrivateTest pri= (PrivateTest) c.newInstance();//1. getDeclaredField(String fieldName):获取运行时类中指定变量名的属性Field name = c.getDeclaredField("name");//2.保证当前属性是可访问的//暴力反射,适用于私有构造方法/对象//public void setAccessible(boolean flag):值为true,取消访问检查name.setAccessible(true);//3.获取、设置指定对象的此属性值name.set(pri,"臭小子");System.out.println(pri.getName());}
}
  • 2.利用反射和File完成以下功能

    1. 利用Class类的forName方法得到File类

    2. 在控制台打印File类的所有构造器

    3. 通过newInstance的方法创建File对象,并创建D:\mynew.txt文件 */

报错!

Exception in thread "main" java.lang.NoSuchMethodException: com.B.Reflect_15.Ask_03.Student.<init>(java.lang.String)at java.base/java.lang.Class.getConstructor0(Class.java:3349)at java.base/java.lang.Class.getConstructor(Class.java:2151)at com.B.Reflect_15.Ask_02.FileDemo.main(FileDemo.java:24)

  •  查看API得到
    public class NoSuchMethodException
    extends ReflectiveOperationException

    当无法找到特定方法时抛出。

最后查看资料后发现出错点在

- Class.forName(全类名)方法  获取class实例对象

这一步,类名错误,改过来就运行正确了

public java.io.File(java.lang.String,java.lang.String)
public java.io.File(java.io.File,java.lang.String)
private java.io.File(java.lang.String,java.io.File)
private java.io.File(java.lang.String,int)
public java.io.File(java.net.URI)
public java.io.File(java.lang.String)进程已结束,退出代码 0

完整代码:

package com.B.Reflect_15.Ask_02;import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;//利用反射和File完成以下功能
//  1.  利用Class类的forName方法得到File类
//  2.  在控制台打印File类的所有构造器
//  3.  通过newInstance的方法创建File对象,并创建D:\mynew.txt文件
public class FileDemo {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
//- Class.forName(全类名)方法  获取class实例对象
//        Class<?> cla = Class.forName("com.B.Reflect_15.Ask_03.Student");Class cla = Class.forName("java.io.File");
//获取File的所有构造器并输出Constructor[] con = cla.getDeclaredConstructors();for (Constructor c : con) {System.out.println(c);}//获取File的一个构造器Constructor<?> constructor = cla.getConstructor(String.class);//用上面得到构造器创建File对象File file = (File) constructor.newInstance("D:\\mynew.txt");//获取File的createNewFile方法Method method = cla.getMethod("createNewFile");//通过createNewFile方法,File对象,完成文件的创建method.invoke(file);}
}

反射课后习题及做题记录相关推荐

  1. 概率期望题(期望 DP)做题记录

    概率期望题(期望 DP)做题记录 P3830 [SHOI2012]随机树 难点在于第二问:生成树的期望深度. 不 wei zhuo 捏,设 \(dp_{i,j}\) 表示已经有了 \(i\) 个叶子结 ...

  2. 数数题(计数类 DP)做题记录

    数数题(计数类 DP)做题记录 CF1657E Star MST 我们称张无向完全图是美丽的当且仅当:所有和 \(1\) 相连的边的边权之和等于这张完全图的最小生成树的边权之和. 完全图点数为 \(n ...

  3. CSDN 第六期编程竞赛做题记录

    CSDN 第六期编程竞赛做题记录 -- CSDN编程竞赛报名地址:https://edu.csdn.net/contest/detail/16 9.18周日闲来无视写一下 csdn 的编程题,每期编程 ...

  4. 退役前的做题记录5.0

    退役前的做题记录5.0 出于某种原因新开了一篇. [CodeChef]Querying on a Grid 对序列建立分治结构,每次处理\((l,mid,r)\)时,以\(mid\)为源点建立最短路树 ...

  5. Regional 做题记录 (50/50)

    写在前面 博主深感自己太弱了QAQ 于是有了一个刷水的想法,Regional的题目还是有很多考查思维的题目,所以这次是乱做50道思考题,可能会顺带做一些水题,这些题的简要题解会写到这篇博文里面,希望能 ...

  6. 2020.7月做题记录

    转眼就到了2020的下半年了-前方仍是一片茫然. 长期计划 prufer 序列 2020.07.02-2020.07.04 Problem Finished P2624 [HNOI2008]明明的烦恼 ...

  7. 退役前的做题记录1.0

    退役前的做题记录1.0 租酥雨最近很懒qwq,具体表现在写题的时候不想发题解了. 但是想想这样也不太好,就决定发个一句话(半句话到几句话不等)题解上来. 2018-09.18-2018-09.28 [ ...

  8. 工程经济学计算机答案,工程经济学课后习题答案计算题刘晓君答案

    1.9现有一项目,其现金流量为:第一年末支付1000万元,第二年末支付1500万元,第 三年收益200万元,第四年收益300万元,第五年收益400万元,第六年到第十年每年收 益500万元,第十一年收益 ...

  9. 【Pikachu】漏洞练习平台做题记录+原理解析(2.2)XSS姿势和技巧

    前言 Pikachu是一个带有漏洞的Web应用系统,在这里包含了常见的web安全漏洞. 如果你是一个Web渗透测试学习人员且正发愁没有合适的靶场进行练习,那么Pikachu可能正合你意. pikach ...

最新文章

  1. vantui框架_vue移动端优秀框架收集
  2. linux下yum包更新不了
  3. K8s 集群节点在线率达到 99.9% 以上,扩容效率提升 50%,我们做了这 3 个深度改造
  4. JS-获取class类名为某个的元素-【getClass】函数封装
  5. 广东轻工计算机多媒体,广东轻工职业技术学院2015年自主招生计算机多媒体技术专业考核大纲...
  6. java 7 jboss_JBoss7 入门指南
  7. (组合数学笔记)Pólya计数理论_Part.1_群的基本概念
  8. 手写数字阅读器用户界面
  9. [译]GotW #1: Variable Initialization 续
  10. 11.程序员的自我修养---运行库
  11. 【GDB调试学习笔记】Makefile多级目录生成可执行文件
  12. Android开发中需要用到的常见APP对应包名
  13. Pycharm修改镜像源并添加信任
  14. 传递组播与广播帧:数据待传指示传递信息(DTIM)
  15. SpringBoot 查询今年所有节假日
  16. java8 list find_java8 多个list对象用lambda求差集操作
  17. 2021-07-27 百度飞桨AI达人创造营手账
  18. 基于上下文的业务流建模法(二)
  19. python:计算自己的bmi值
  20. tablayout 滚动模式_Android底部导航栏(可滑动)----TabLayout+viewPager

热门文章

  1. outlook企业邮箱服务器怎么填,Outlook客户端怎么配置企业邮箱
  2. 一些最基本的健身知识分享
  3. 机器学习 | 样本不平衡问题处理方法
  4. Springboot 整合 kafka 实现消息的发布和订阅
  5. writing idiomatic python 读书笔记(5)
  6. 巧萌易携之ROS2Go的不完全教研攻略
  7. Euclidean algorithm
  8. [C++]判断齐次坐标系中三点是否共线(三个向量是否共面)
  9. word中表格标题设置重复显示时不成功且表格自动换页问题
  10. ps照片人像油画复古效果怎么做