Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Java类如何防止被实例化

Java类如何防止被实例化

作者头像
夹胡碰
发布于 2020-08-14 08:24:44
发布于 2020-08-14 08:24:44
1.8K00
代码可运行
举报
文章被收录于专栏:程序猿~程序猿~
运行总次数:0
代码可运行
有一些类不想被实例化, 比如静态方法的工具类, 这时要对类进行特殊处理
其中有两点需要注意:
  • 防止通过new实例化 - 解决办法:使用 private 修饰符进行限制
  • 防止通过反射实例化 - 解决办法:抛出 Error 进行限制(如果不抛出异常, 只通过private进行限制, 则通过反射依然能被实例化)
代码如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 不可实例化工具类
public final class MyUtils {
    private MyUtils() {
        throw new AssertionError("No " + MyUtils.class.getName() + " instances for you !");
    }
}
实例化测试:
  • new实例化
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 编译报错 - MyUtils() 在 com.jiafupeng.controller.rest.MyUtils 中是 private 访问控制
MyUtils myUtils = new MyUtils();
  • 反射实例化
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Class<MyUtils> adminClass = MyUtils.class;
Constructor<?>[] declaredConstructors = adminClass.getDeclaredConstructors();
Constructor<?> c = declaredConstructors[0];
c.setAccessible(true);//  使其能访问到private构造方法
Object o = c.newInstance();
System.out.println(o);

// 运行报错
Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.jiafupeng.controller.rest.UserController.main(UserController.java:59)
Caused by: java.lang.AssertionError: No com.jiafupeng.controller.rest.MyUtils instances for you !
    at com.jiafupeng.controller.rest.MyUtils.<init>(MyUtils.java:11)
    ... 5 more
拓展 可参考 java.util.Objects
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * This class consists of {@code static} utility methods for operating
 * on objects.  These utilities include {@code null}-safe or {@code
 * null}-tolerant methods for computing the hash code of an object,
 * returning a string for an object, and comparing two objects.
 *
 * @since 1.7
 */
public final class Objects {
    private Objects() {
        throw new AssertionError("No java.util.Objects instances for you!");
    }
    ...
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深入分析Java反射(七)-简述反射调用的底层实现
Java反射的API在JavaSE1.7的时候已经基本完善,但是本文编写的时候使用的是Oracle JDK11,因为JDK11对于sun包下的源码也上传了,可以直接通过IDE查看对应的源码和进行Debug。
Throwable
2020/06/23
1.2K0
反射基础之Constructor
构造器的声明包含了:名字,修饰符,参数和异常。可以通过java.lang.reflect.Constructor类获取这些信息。 下面的例子描述了如何获取构造器:
代码拾遗
2018/07/24
6810
Java 中文官方教程 2022 版(四十四)
反射提供了一种在类上调用方法的方式。通常,只有在非反射代码中无法将类的实例强制转换为所需类型时才需要这样做。方法是使用java.lang.reflect.Method.invoke()来调用的。第一个参数是要调用该特定方法的对象实例。(如果方法是static,第一个参数应为null。)后续参数是方法的参数。如果底层方法抛出异常,它将被java.lang.reflect.InvocationTargetException包装。可以使用异常链接机制的InvocationTargetException.getCause()方法检索方法的原始异常。
ApacheCN_飞龙
2024/05/24
2290
Java设计模式之单例模式
一般单例模式口诀:两私一公。 具体说就是私有构造方法、私有静态实例、公开的静态获取方法。
程裕强
2022/05/06
2600
Java设计模式之单例模式
月薪5万程序员眼中的单例模式
引言 其实写这篇文章之前,我犹豫了一下,毕竟单例大家都知道,写这么一篇文章会不会让人觉得老掉牙。后来想想,就当一种记录吧。先来一副漫画吧,如下图所示 ok,我们回顾下小灰的遭遇,上述漫画所提出的那
架构师小秘圈
2018/06/04
8391
设计模式【1.1】-- 你想如何破坏单例模式?
单例模式:是一种创建型设计模式,目的是保证全局一个类只有一个实例对象,分为懒汉式和饿汉式。所谓懒汉式,类似于懒加载,需要的时候才会触发初始化实例对象。而饿汉式正好相反,项目启动,类加载的时候,就会创建初始化单例对象。
秦怀杂货店
2020/12/26
7190
深入理解Java中的反射机制和使用原理!详细解析invoke方法的执行和使用
newInstance方法可以根据传入的参数来调用对应的Constructor创建对象的实例
攻城狮Chova
2022/02/24
2K0
深入理解Java中的反射机制和使用原理!详细解析invoke方法的执行和使用
java 反射机制说的透彻一点
很多时候我们会遇到别人问一个问题:你给我讲一下反射,到底是什么东西?怎么实现的?我们能用反射来做什么?它有什么优缺点?下面我们会围绕着这几个问题展开:
秦怀杂货店
2020/11/22
7030
java 反射机制说的透彻一点
浅谈 Java 中的 Class 类
最近一段时间,对于 java 的反射比较感兴趣,于是打算通过深入学习来更好的了解反射的实现机制。于是开始查阅有关反射的博文,但是在学习的过程中,发现 Class 类始终伴随着反射出现。因为多少接触过 Class 类,所以有关反射的代码还是能看懂的,不会影响我学习反射的知识,本就可以直接略过。
全栈程序员站长
2022/09/01
2990
java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClie
1、启动hive的时候出现这个问题,报错如下所示: 1 [hadoop@slaver1 conf]$ hive 2 3 Logging initialized using configuration in jar:file:/home/hadoop/soft/hive-0.13.1-cdh5.3.6/lib/hive-common-0.13.1-cdh5.3.6.jar!/hive-log4j.properties 4 Exception in thread "main" java.lang.Ru
别先生
2018/05/16
1.2K0
idea连接mysql数据库报java.lang.RuntimeException: com.mysql.cj.exceptions.InvalidConnectionAttributeExcepti
java.lang.RuntimeException: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value ‘Öйú±ê׼ʱ¼ä’ is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61) at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:85) at com.mysql.cj.util.TimeUtil.getCanonicalTimezone(TimeUtil.java:132) at com.mysql.cj.protocol.a.NativePro… (show balloon)
全栈程序员站长
2022/09/15
1.1K0
idea连接mysql数据库报java.lang.RuntimeException: com.mysql.cj.exceptions.InvalidConnectionAttributeExcepti
设计模式——单例模式
关于单例模式,这是面试时最容易遇到的问题。当时以为很简单的内容,深挖一下,也可以关联出类加载、序列化等知识。
健程之道
2020/03/11
4060
Caused by: java.net.ConnectException: Connection refused/Caused by: java.lang.RuntimeException: com.
1、使用sqoop技术将mysql的数据导入到Hive出现的错误如下所示: 第一次使用命令如下所示: 1 [hadoop@slaver1 sqoop-1.4.5-cdh5.3.6]$ bin/sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --table tb_user --hive-import --m 1 2 Warning: /home/hadoop/soft/s
别先生
2018/05/28
2.2K0
设计模式 | 单例模式及典型应用
单例是最常见的设计模式之一,实现的方式非常多,同时需要注意的问题也非常多。要内容:
小旋锋
2019/01/21
1K0
【Hive】ERROR exec.DDLTask: java.lang.UnsatisfiedLinkError: org.apache.hadoop.util.NativeCrc32.nati...
1/在$HADOOP_HOME/lib/native下面放了2.5.0-native-snappy.tar.gz,这是HDFS存储压缩所需的本地lib包。 cd ~/app/hadoop-2.5.0-cdh5.3.6/lib/native/
sparkle123
2018/07/25
9630
Hive创建表时报错 顶
hive> create table t_emp ( > id int, > name string, > age int, > dept_name string > ) > ROW FORMAT DELIMITED > FIELDS TERMINATED BY ','; FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:javax.jdo.JDODataStoreException: An exception was thrown while adding/validating class(es) : Specified key was too long; max key length is 767 bytes com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Specified key was too long; max key length is 767 bytes at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:422) at com.mysql.jdbc.Util.handleNewInstance(Util.java:409) at com.mysql.jdbc.Util.getInstance(Util.java:384)
算法之名
2019/08/20
6110
深究Java Hibernate框架下的Deserialization
 写在前面  Hibernate是一个开源免费的、基于 ORM 技术的 Java 持久化框架。通俗地说,Hibernate 是一个用来连接和操作数据库的 Java 框架,它最大的优点是使用了 ORM 技术。 Hibernate 支持几乎所有主流的关系型数据库,只要在配置文件中设置好当前正在使用的数据库,程序员就不需要操心不同数据库之间的差异。  分析  对于Hibernate框架的反序列化链主要是通过调用了任意的getter方法,结合TemplatesImpl这条链子进行利用链的构造。 BasicPro
FB客服
2023/03/30
6440
深究Java Hibernate框架下的Deserialization
JUnit单元测试报错NoClassDefFoundError: org/junit/platform/launcher/core/LauncherFactory
因为 JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage
JavaEdge
2022/11/30
7490
JUnit单元测试报错NoClassDefFoundError: org/junit/platform/launcher/core/LauncherFactory
深入分析Java反射(五)-类实例化和类加载
其实在前面写过的《深入分析Java反射(一)-核心类库和方法》已经介绍过通过类名或者java.lang.Class实例去实例化一个对象,在《浅析Java中的资源加载》中也比较详细地介绍过类加载过程中的双亲委派模型,这篇文章主要是加深一些对类实例化和类加载的认识。
Throwable
2020/06/23
1.5K0
IDEA动态调试(二)——反序列化漏洞(Fastjson)
成因:在把其他格式的数据反序列化成java类的过程中,由于输入可控,导致可以执行其他恶意命令,但追根究底是需要被反序列化的类中重写了readObject方法,且被重写的readObject方法/调用链中被插入了恶意命令。
Jayway
2020/03/16
2.7K0
IDEA动态调试(二)——反序列化漏洞(Fastjson)
推荐阅读
相关推荐
深入分析Java反射(七)-简述反射调用的底层实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验