java动态加载类和静态加载类笔记
JAVA中的静态加载类是编译时刻加载类 动态加载类指的是运行时刻加载类
二者有什么区别呢
举一个例子 现在我创建了一个类 实现的功能假设为通过传入的参数调用具体的类和方法
class office
{
public static void main(String args[])
{
if("word".equals(args[0])
{
word w=new word();
word.run();
}
if("excel".equals(args[0])
{
excel.run();
}
}
}
这个文件另存为office.java 很明显 这个类是无法编译通过的 运行javac office.java时 会报错无法找到类word 无法找到方法run 无法找到类excel 无法找到方法run
那我再新建一个文件word.java 功能为输出hello world number 1
class word
{
public void run(String args[])
{
System.out.println("hello world number 1")
}
}
这个时候我们再去编译office.java 就是会报错无法找到excel 和excel的run 方法
tips: new 创建对象 是静态加载类 在编译时刻就需要加载所有的可能使用到的类
如果说 我们就需要用到word的run 方法 excel的run方法我们暂时不会用到怎么办呢 在本例中word已经写好了 因为主程序无法编译却不能用 无疑这是每个程序员都不愿意看到的
考虑到实际开发过程中 我们写的方法肯定不会只有两种 假设 我们有一百种方法 但是其中有一个方法可能有问题 在我们的例子中就是excel 那么其他99种方法都不能用 因为无法编译通过 在实际项目中 这个肯定是无法接受的
这个时候 我们就需要用到类的动态加载 我们创建一个改善类 另存为officebetter.java
class officebetter
{
public static void main(String args[])
{
//动态加载类 在运行的时刻加载类
Class c=Class.forName(args[0]); }
}
这个时候 我们去编译这个文件
执行命令:javac officebetter.java 是不会报任何错误的
但是我们去运行的时候 传入一个参数excell 表示我们想加载excell 这个类
执行命令: java officebetter excell
就会报错无法找到excell这个类 再修改一下之前的类
class officebetter
{
public static void main(String args[])
{
//动态加载类 在运行的时刻加载类
Class c=Class.forName(args[0]);
//通过类类型 创建该类对象
word a=(word) c.newInstance();
a.run();
}
}
我们执行 java officebetter word 就会发现 程序能够正常输出我们想要的字符串
java动态加载类和静态加载类笔记的更多相关文章
- JAVA类的静态加载和动态加载以及NoClassDefFoundError和ClassNotFoundException
我们都知道Java初始化一个类的时候可以用new 操作符来初始化, 也可通过Class.forName()的方式来得到一个Class类型的实例,然后通过这个Class类型的实例的newInstance ...
- MiniUI treeGrid 动态加载数据与静态加载数据的区别
说明:treegrid静态数据加载时数据结构是一棵树包含children节点集合,而采用动态加载数据时数据是List结构的具体项. 静态加载数据 test1.html <!DOCTYPE htm ...
- java 动态代理(模式) InvocationHandler(为类中方法执行前或后添加内容)
动态代理属于Java反射的一种. 当我们得到一个对象,想动态的为其一些方法每次被调用前后追加一些操作时,我们将会用到java动态代理. 下边上代码: 首先定义一个接口: package com.liu ...
- Java动态加载类
详见:https://blog.csdn.net/zai_xia/article/details/80026325 扩展:java反射机制与动态加载类 https://www.cnblogs.com/ ...
- 反射01 Class类的使用、动态加载类、类类型说明、获取类的信息
0 Java反射机制 反射(Reflection)是 Java 的高级特性之一,是框架实现的基础. 0.1 定义 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对 ...
- Android Fragment生命周期及静态加载
一个Fragment必须总是被嵌入到一个Activity中,它的生命周期直接被其所属的宿主Activity生命周期影响,它的状态会随宿主的状态变化而变化. 要创建一个Fragment 必须创建一个Fr ...
- 【转载】Java 动态代理
Java 动态代理 本文为 Android 开源项目源码解析 公共技术点中的 动态代理 部分项目地址:Jave Proxy,分析的版本:openjdk 1.6,Demo 地址:Proxy Demo分析 ...
- 深入浅出Java动态代理
文章首发于[博客园-陈树义],点击跳转到原文深入浅出Java动态代理 代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中,更是有举足轻重的地位.代理 ...
- Java动态代理 深度详解
代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中,更是有举足轻重的地位.代理模式从类型上来说,可以分为静态代理和动态代理两种类型. 今天我将用非常 ...
随机推荐
- 利用硬链接和truncate降低drop table对线上环境的影响
众所周知drop table会严重的消耗服务器IO性能,如果被drop的table容量较大,甚至会影响到线上的正常. 首先,我们看一下为什么drop容量大的table会影响线上服务 直接执行drop ...
- laravel 指定 版本安装
composer create-project laravel/laravel=5.0.* --prefer-dist composer create-project laravel/laravel= ...
- PASCAL==CALLBACK==WINAPI==__stdcall
VC里面:PASCAL==CALLBACK==WINAPI==__stdcall _stdcall是Pascal程序的缺省调用方式,通常用于Win32 Api中,函数采用从右到左的压 ...
- gcc-常见命令和错误
一:编译过程的4个阶段:预处理,编译,汇编,链接; 1:最常用的方式 gcc hello.c -o hello 2:预处理后停止编译 gcc -E hello.c -o hello.i(.i通常为 ...
- Linux进程启动过程简析
朱宇轲 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 今天,我们将通过 ...
- FPGA边缘检测
沿检测技术在项目应用中, 非常低广泛. 如要有效捕获信号跳变沿, 边沿 检测技术的应用是必不可少的.大致如下: (1) 将时钟边沿使能转换为边沿检测使能,使时钟同步化. (2) 捕获信号的突变( UA ...
- html字符字体转换
- CSS基础篇
写的不错,收藏 http://www.cnblogs.com/suoning/p/5625582.html
- SQL笔记 [SQL判断是否存在] [长期更新] (-2015.4)
--判断某个存储过程是否存在if exists (select * from sysobjects where id = object_id(N'[p_CreateTable]') and OBJEC ...
- jsp request 对象详解
转自:http://www.cnblogs.com/qqnnhhbb/archive/2007/10/16/926234.html 1.request对象 客户端的请求信息被封装在request对象中 ...