网站首页 > java教程 正文
反射机制(低)
在我刚开始学Java的时候,大家都很难理解反射这个概念,在实际开发中,虽然都有反射的踪影,但感觉自己又能理解是的。反射机制是指在程序运行时,对任意一个类都能获取其所有属性和方法,并且对任意一个对象都能调用其任意一个方法。
反射的步骤如下:
1. 获取想要操作的类的Class对象,该Class对象是反射的核心,通过它可以调用类的任意方法。
2. 调用Class对象所对应的类中定义的方法,这是反射的使用阶段。
3. 使用反射API来获取并调用类的属性和方法等信息。
我个人观点,反射这个概念,在一些框架/工具封装的时候,会经常用到,大家使用第三方Jar包的时候,可以点击里面的源码去看看,在里面就可以发现很多反射的踪影。
此时,可能有部分朋友会有这个疑问,反射和new有什么区别?
我个人觉得主要区别在于这些地方:
1. 从整体效果来说,其实两者都是差不到,都是能获取对象。
2. new对象,是无法调用该类的私有的东西,但反射是可以的。
3. new对象,属于静态编译,即在你启动程序时,就把这个对象加载进来;反射是动态编译,只有运行到这个代码时,才会获取对象。
4. 动态编译速度快,而且还可以节省系统资源,特别是一些框架(如Spring)应用场景会更丰富,没有局限性。当然,也会导致我们使用过程中,会稍微复杂一些。
内部类(低)
从字面很容易清楚内部类的意思,定义在类内部的类就叫做内部类,但根据不同的定义方式,又可以分为静态内部类、成员内部类、局部内部类和匿名内部类。
静态内部类
我们新建一个类(StaticInnerDemo1):
package com.ispeasant.innerclass;
/**
* 静态内部类
*/
public class StaticInnerDemo1 {
// 定义一个静态内部类
public static class StaticIC {
// 定义一个方法,方便测试
public void speak() {
System.out.println("StaticIC.speak");
}
}
public static void main(String[] args) {
StaticIC staticIC = new StaticIC();
staticIC.speak();
}
}
运行结果如下:
StaticIC.speak
证明,StaticInnerDemo1类是可以调用静态内部类StaticIC的方法speak()。那我们测试一下,再新建一个类,看能不能调用StaticInnerDemo1类里的静态内部类StaticIC的方法speak()。
package com.ispeasant.innerclass;
/**
* 测试“能不能调用StaticInnerDemo1类里的静态内部类StaticIC的方法speak()”
*/
public class StaticInnerDemo2 {
public static void main(String[] args) {
StaticInnerDemo1.StaticIC staticIC = new StaticInnerDemo1.StaticIC();
staticIC.speak();
}
}
运行结果如下:
StaticIC.speak
因此可以证明,其它类也可以调用这个静态内部类的方法,不过调用方式和内部调用有点区别,是需要通过“外部类.静态内部类”的方式进行调用。
漏了一种情况没有测试,就是静态内部类能否调用外部的变量和方法,我们修改一下之前的代码看看:
package com.ispeasant.innerclass;
/**
* 静态内部类
*/
public class StaticInnerDemo1 {
// 定义一个变量,看看静态内部类能否调用
private static String info = "外部变量";
// 定义一个方法,看看静态内部类能否调用。
public static void printInfo(){
System.out.println(info);
}
// 定义一个静态内部类
public static class StaticIC {
// 定义一个方法,方便测试
public void speak() {
System.out.println("StaticIC.speak");
}
public void getInfo(){
System.out.println(info);
printInfo();
}
}
public static void main(String[] args) {
StaticIC staticIC = new StaticIC();
staticIC.speak();
staticIC.getInfo();
}
}
运行结果如下:
StaticIC.speak
外部变量
外部变量
证明也是可以调用,但由于是静态内部类,这个变量也是必须static修饰。
总结:静态内部类可以访问外部类的静态变量和方法,静态内部类通过“外部类.静态内部类”的方式来调用。
成员内部类
我个人觉得成员内部类和静态内部类的区别,主要在于“静态”两个字,对应用场景多了一点点限制,其余使用方式都差不多。
package com.ispeasant.innerclass;
/**
* 成员内部类
*/
public class MemberInnerDemo1 {
// 定义一个变量,看看成员内部类能否调用
private String info = "外部变量";
// 定义一个变量,看看成员内部类能否调用
private static String info2 = "静态外部变量";
// 成员内部类
public class MemberID {
public void speak(){
System.out.println("MemberID.speak");
System.out.println(info);
System.out.println(info2);
}
}
}
局部内部类
指的是定义在方法中的类叫作局部内部类,意思比前面两种更局部,这个就没什么好介绍的。
匿名内部类
匿名内部类,会相对复杂一些。但这个也是用得比较多,特别是在一些开源框架里,经常都可以看到。建议大家还是需要认真消化一下,理解其中的原理和过程。
匿名内部类,是指通过继承一个父类或者实现一个接口的方式直接定义并使用的类。
先创建一个抽象类:
package com.ispeasant.innerclass;
/**
* 匿名内部类(抽象类)
*/
public abstract class AnonymousInnerDemo1 {
private String info;
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
public abstract String printInfo();
}
再新建一个类来测试验证:
package com.ispeasant.innerclass;
/**
* 测试匿名内部类
*/
public class AnonymousInnerDemo2 {
public void testAID(AnonymousInnerDemo1 aid){
System.out.println(aid.getInfo());
System.out.println(aid.printInfo());
}
public static void main(String[] args) {
AnonymousInnerDemo2 anonymousInnerDemo2 = new AnonymousInnerDemo2();
anonymousInnerDemo2.testAID(new AnonymousInnerDemo1() {
@Override
public String printInfo() {
return "printInfo";
}
public String getInfo(){
return "匿名内部类";
}
});
}
}
运行效果如下:
匿名内部类
printInfo
猜你喜欢
- 2024-10-10 [职场] 面试自我介绍怎么办(面试自我介绍时怎么说)
- 2024-10-10 【面试模板】自我介绍的模板和示例(收藏)
- 2024-10-10 【2024全栈版】Java面试八股文,刷完你也可以当架构师!
- 2024-10-10 终于约到JAVA面试了#日常vlog(java面试提前到还是准时)
- 2024-10-10 当众面试,自我介绍要令人心动(当面自我介绍怎么说)
- 2024-10-10 Java程序员,面试题汇总(java程序员面试笔试真题库)
- 2024-10-10 一个Java程序员如果打算面试Go语言的职位,应该知道的
- 2024-10-10 第一次面试13-14的java开发#应届生
- 2024-10-10 一开口就拿捏面试官的自我介绍】“请做一个自我介绍”
- 2024-10-10 面试一分钟的自我介绍,这五句话能让面试官眼前一亮!
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)