信息发布软件,b2b软件,广告发布软件

 找回密码
 立即注册
搜索
查看: 1905|回复: 2
打印 上一主题 下一主题

[『 Java 图文教程』] Java类别载入器和实例多教程用法

  [复制链接]

4

主题

11

帖子

97

积分

积分
97
跳转到指定楼层
宣传软件楼主
发表于 2016-9-25 11:17:22 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

软件教程首图:

软件教程分类:Java 图文教程 

软件图文教程视频教程分类:软件图文教程 

软件教程难易程度:软件初级教程 

软件教程发布日期:2016-09-25

软件教程关键字:Java类别载入器

① 本信息收集于网络,如有不对的地方欢迎联系我纠正!
② 本信息免费收录,不存在价格的问题!
③ 如果您的网站也想这样出现在这里,请您加好友情链接,我当天会审核通过!

④友情链接关键字:软件定制网站 网址:http://www.postbbs.com

软件教程详细描述

 1 Java的动态特性

Java的动态特性有两种,一是隐式的;另一种是显示的。隐式的(implicit)方法就是当程式设计师用到new 这个Java 关键字时,会让类别载入器依需求载入您所需要的类别,这种方式使用了隐式的(implicit)方法。显式的方法,又分成两种方式,一种是藉由java.lang.Class 里的forName()方法,另一种则

是藉由java.lang.ClassLoader 里的loadClass()方法。您可以任意选用其中一种方法。

  2 隐式的动态特性

在执行java文件时,只有单独的变量声明是不会载入相应的类的,只有在用new生成实例时才载入

如示例所示:

public class Main

public static void main(String args[])

{

A a1 = new A() ;

B b1 ;

}

类A和B相同,如下:

public class A

{

public void print(“using A”);

}

编译后,可用java –verbose:class Main运行,察看输出结果。可以看到JVM只载入了A,而没有载入B.

另外,类的载入只在执行到new一个类时,才载入,如果没有执行到new语句,则不载入。

如://类Office

public class Office

{

public static void main(String[] args)

{

Word myword=null;

Excel myexcel=null;

if (args[0].equals("Word"))

{

myword = new Word();

myword.start();

}

if (args[0].equals("Excel"))

{

myexcel = new Excel();

myexcel.start();

}

}

}


//类Word和Excel基本相同,如下

public class Word

{

public void start()

{

System.out.println("using word");

}

}

在dos命令提示符下,输入java –verbose Office Excel可以看到JVM只载入Excel类,而不载入Word类。

3 显示的动态特性

3.1 java.lang.Class里的forName()方法

在上一个Office示例中,进行如下修改:

一 加入Assembly类

public interface Assembly

{

public void start();

}

二 让Word和Excel类实现该接口

public class Word implements Assembly

{

public void start()

{

System.out.println("using word");

}

}

三 Office 类如下所示

public class Office

{

public static void main(String[] args) throws Exception

{

java.lang.Class c = java.lang.Class.forName(args[0]);

Object o = c.newInstance();

Assembly a = (Assembly)o;

a.start();

}

}


  在命令提示符下输入java –verbose Office Word 输出入下:

通过上图你可以看到,interface 如同class 一般,会由编译器产生一个独立的类别档(.class),当类别载入器载入类别时,如果发现该类别继承了其他类别,或是实作了其他介面,就会先载入代表该介面的类别档,也会载入其父类别的类别档,如果父类别也有其父类别,也会一并优先载入。换句话说,类别载入器会依继承体系最上层的类别往下依序载入,直到所有的祖先类别都载入了,才轮到自己载入。

下面介绍一下 forName 函数, 如果您亲自搜寻Java 2 SDK 说明档内部对於Class 这个类别的说明,您可以发现其实有两个forName()方法,一个是只有一个参数的(就是之前程式之中所使用的):

public static Class forName(String className)

另外一个是需要三个参数的:

public static Class forName(String name, boolean initialize,ClassLoader loader)

这两个方法,最後都是连接到原生方法forName0(),其宣告如下:

private static native Class forName0(String name, boolean initialize, ClassLoader loader)

throws ClassNotFoundException;

只有一个参数的forName()方法,最後叫用的是:

forName0(className, true, ClassLoader.getCallerClassLoader());

而具有三个参数的forName()方法,最後叫用的是:

forName0(name, initialize, loader);

这里initialize参数指,在载入类之后是否进行初始化,对于该参数的作用可用如下示例察看:

类里的静态初始化块在类第一次被初始化时才被呼叫,且仅呼叫一次。在Word类里,加入静态初始化块

public class Word implements Assembly

{

static

{

System.out.println("word static initialization ");

}

public void start()

{

System.out.println("using word");

}

}

将类Office作如下改变:

public class Office

{

public static void main(String[] args) throws Exception

{

Office off= new Office();

System.out.println("类别准备载入");

java.lang.Class c = java.lang.Class.forName(args[0],true,off.getClass().getClassLoader());

System.out.println("类别准备实体化");

Object o = c.newInstance();

Object o2 = c.newInstance();

}

}


  如果第二个参数为true 则输出入下

如果为false ,则输出入下:

可见,类里的静态初始化块仅在初始化时才执行,且不过初始化几次,它仅执行一次(这里有一个条件,那就是只有它是被同一个类别载入器多次载入时,才是这样,如果被不同的载入器,载入多次,则静态初始化块会执行多次)。

关于第三个参数请见下节介绍

3.2 直接使用类别载入器 java.lang.ClassLoader

在Java 之中,每个类别最後的老祖宗都是Object,而Object 里有一个名为getClass()的方法,就是用来取得某特定实体所属类别的参考,这个参考,指向的是一个名为Class 类别(Class.class) 的实体,您无法自行产生一个Class 类别的实体,因为它的建构式被宣告成private,这个Class 类别的实体是在类别档(.class)第一次载入记忆体时就建立的,往後您在程式中产生任何该类别的实体,这些实体的内部都会有一个栏位记录着这个Class 类别的所在位置。

基本上,我们可以把每个Class 类别的实体,当作是某个类别在记忆体中的代理人。每次我们需要

查询该类别的资料(如其中的field、method 等)时,就可以请这个实体帮我们代劳。事实上,Java的Reflection 机制,就大量地利用Class 类别。去深入Class 类别的原始码,我们可以发现Class类别的定义中大多数的方法都是原生方法(native method)。

在Java 之中,每个类别都是由某个类别载入器(ClassLoader 的实体)来载入,因此,Class 类别的实体中,都会有栏位记录着载入它的ClassLoader 的实体(注意:如果该栏位是null,并不代表它不是由类别载入器所载入,而是代表这个类别由靴带式载入器(bootstrap loader,也有人称rootloader)所载入,只不过因为这个载入器并不是用Java 所写成,是用C++写的,所以逻辑上没有实体)。

系统里同时存在多个ClassLoader 的实体,而且一个类别载入器不限於只能载入一个类别,类别载入器可以载入多个类别。所以,只要取得Class 类别实体的参考,就可以利用其getClassLoader()方法篮取得载入该类别之类别载入器的参考。getClassLoader()方法最後会呼叫原生方法getClassLoader0(),其宣告如下:private native ClassLoader getClassLoader0();

最後,取得了ClassLoader 的实体,我们就可以叫用其loadClass()方法帮我们载入我们想要的类别,因此上面的Office类可做如下修改:

public class Office

{

public static void main(String[] args) throws Exception

{

Office off= new Office();

System.out.println("类别准备载入");

ClassLoader loader = off.getClass().getClassLoader();

java.lang.Class c = loader.loadClass(args[0]);

System.out.println("类别准备实体化");

Object o = c.newInstance();

Object o2 = c.newInstance();

}

}


  其输出结果同forName方法的第二个参数为false时相同。可见载入器载入类时只进行载入,不进行初始化。

获取ClassLoader还可以用如下的方法:

public class Office

{

public static void main(String[] args) throws Exception

{

java.lang.Class cb = Office.class;

System.out.println("类别准备载入");

ClassLoader loader = cb.getClassLoader();

java.lang.Class c = loader.loadClass(args[0]);

System.out.println("类别准备实体化");

Object o = c.newInstance();

Object o2 = c.newInstance();

}

}

在此之前,当我们谈到使用类别载入器来载入类别时,都是使用既有的类别载入器来帮我们载

入我们所指定的类别。那麽,我们可以自己产生类别载入器来帮我们载入类别吗? 答案是肯定的。

利用Java 本身提供的java.net.URLClassLoader 类别就可以做到。

public class Office

{

public static void main(String[] args) throws Exception

{

URL u = new URL("file:/d:/myapp/classload/");

URLClassLoader ucl = new URLClassLoader(new URL[]{u});

java.lang.Class c = ucl.loadClass(args[0]);

Assembly asm = (Assembly)c.newInstance();

asm.start();

}

}

在这个范例中,我们自己产生java.net.URLClassLoader 的实体来帮我们载入我们所需要的类别。但是载入前,我们必须告诉URLClassLoader 去哪个地方寻找我们所指定的类别才行,所以我们必须给它一个URL 类别所构成的阵列,代表我们希望它去搜寻的所有位置。URL 可以指向网际网路上的任何位置,也可以指向我们电脑里的档案系统(包含JAR 档)。在上述范例中,我们希望URLClassLoader 到d:mylib 这个目录下去寻找我们需要的类别, 所以指定的URL为”file:/d:/my/lib/”。其实,如果我们请求的位置是主要类别(有public static void main(String args[])方法的那个类别)的相对目录,我们可以在URL 的地方只写”file:lib/”,代表相对於目前的目录。


  下面我们来看一下系统为我们提供的3个类别载入器:

java.exe 是利用几个基本原则来寻找Java Runtime Environment(JRE),然後把类别档(.class)直接转交给JRE 执行之後,java.exe 就功成身退。类别载入器也是构成JRE 的其中一个重要成员,所以最後类别载入器就会自动从所在之JRE 目录底下的lib t.jar 载入基础类别函式库。

当我们在命令列输入java xxx.class 的时候,java.exe 根据我们之前所提过的逻辑找到了JRE(Java Runtime Environment),接着找到位在JRE 之中的jvm.dll(真正的Java 虚拟机器),最後载入这个动态联结函式库,启动Java 虚拟机器。虚拟机器一启动,会先做一些初始化的动作,比方说抓取系统参数等。一旦初始化动作完成之後,就会产生第一个类别载入器,即所谓的Bootstrap Loader,Bootstrap Loader 是由C++所撰写而成(所以前面我们说,以Java 的观点来看,逻辑上并不存在Bootstrap Loader 的类别实体,所以在Java 程式码里试图印出其内容的时候,我们会看到的输出为null),这个Bootstrap Loader 所

做的初始工作中,除了也做一些基本的初始化动作之外,最重要的就是载入定义在sun.misc 命名空间底下的Launcher.java 之中的ExtClassLoader(因为是inner class,所以编译之後会变成Launcher$ExtClassLoader.class),并设定其Parent 为null,代表其父载入器为BootstrapLoader。然後Bootstrap Loader 再要求载入定义於sun.misc 命名空间底下的Launcher.java 之中的AppClassLoader(因为是inner class,所以编译之後会变成Launcher$AppClassLoader.class),并设定其Parent 为之前产生的ExtClassLoader 实体。

这里要请大家注意的是,Launcher$ExtClassLoader.class 与Launcher$AppClassLoader.class 都可能是由Bootstrap Loader 所载入,所以Parent 和由哪个类别载入器载入没有关系。

三个载入器的层次关系可通过运行下面的例子察看:

public class Test

{

public static void main(String[] args)

{

ClassLoader cl1 = Test.class.getClassLoader();

System.out.println(cl1);

ClassLoader cl2 = cl1.getParent();

System.out.println(cl2);

ClassLoader cl3 = cl2.getParent();

System.out.println(cl3);

}

}

运行结果:

////////////////////////////////////////////////////////////

sun.misc.Launcher$AppClassLoader@1a0c10f

sun.misc.Launcher$ExtClassLoader@e2eec8

null

//////////////////////////////////////////////////////////

如果在上述程式中,如果您使用程式码:

cl1.getClass.getClassLoader()及cl2.getClass.getClassLoader(),您会发现印出的都是null,

这代表它们都是由Bootstrap Loader 所载入。这里也再次强调,类别载入器由谁载入(这句话有点

诡异,类别载入器也要由类别载入器载入,这是因为除了Bootstrap Loader 之外,其余的类别载

入器皆是由Java 撰写而成),和它的Parent 是谁没有关系,Parent 的存在只是为了某些特殊目的,

这个目的我们将在稍後作解释。

在此要请大家注意的是,AppClassLoader 和ExtClassLoader 都是URLClassLoader 的子类别。

由於它们都是URLClassLoader 的子类别,所以它们也应该有URL 作为搜寻类别档的参考,由原始码

中我们可以得知,AppClassLoader 所参考的URL 是从系统参数java.class.path 取出的字串所决定,

而java.class.path 则是由我们在执行java.exe 时,利用–cp 或-classpath 或CLASSPATH 环境变

数所决定。


用如下示例测试:

public class AppLoader

{

public static void main(String[] args)

{

String s = System.getProperty("java.class.path");

System.out.println(s);

}

}

/////////////////////////////////////////////////////////////////

D:myappclassload>java AppLoader

.;D:myjavaTomcat5.0webappsaxisWEB-INFlibaxis.jar;D:myjavaTomcat5.0weba

ppsaxisWEB-INFlibcommons-logging.jar;D:myjavaTomcat5.0webappsaxisWEB-IN

Flibcommons-discovery.jar;Cracleora81jdbclibclasses12.zip;D:myjavaJDB

CforSQLserverlibmssqlserver.jar;D:myjavaJDBCforSQLserverlibmsbase.jar;D:m

yjavaJDBCforSQLserverlibmsutil.jar;D:myjavaTomcat5.0commonlibservlet-api

.jar;D:myjavaj2sdk1.4.2_04jrelib t.jar;C:sunappserverlibj2ee.jar;D:myj

avaj2sdk1.4.2_04libjaxp.jar;D:myjavaj2sdk1.4.2_04libsax.jar;

D:myappclassload>java -classpath .;d:myapp AppLoader

.;d:myapp

/////////////////////////////////////////////////////////////////

从这个输出结果,我们可以看出,在预设情况下,AppClassLoader 的搜寻路径为”.”(目前所在目

录),如果使用-classpath 选项(与-cp 等效),就可以改变AppClassLoader 的搜寻路径,如果没有

指定-classpath 选项,就会搜寻环境变数CLASSPATH。如果同时有CLASSPATH 的环境设定与

-classpath 选项,则以-classpath 选项的内容为主,CLASSPATH 的环境设定与-classpath 选项两者

的内容不会有加成的效果。

至於ExtClassLoader 也有相同的情形,不过其搜寻路径是参考系统参数java.ext.dirs。

系统参数java.ext.dirs 的内容,会指向java.exe 所选择的JRE 所在位置下的libext 子目录。Java.exe使用的JRE是在系统变量path里指定的,可以通过修改path从而修改ExtCLassLoader的搜寻路径,也可以如下命令参数来更改,

java –Djava.ext.dirs=c:winnt AppLoader //注意 =号两边不能有空格。-D也不能和java分开。

////////////////////////////////////////////////////////////////

D:myappclassload>java ExtLoader

D:myjavaj2sdk1.4.2_04jrelibext

D:myappclassload>java -Djava.ext.dirs=c:winnt ExtLoader

c:winnt

////////////////////////////////////////////////////////////////

最後一个类别载入器是Bootstrap Loader , 我们可以经由查询由系统参数sun.boot.class.path 得知Bootstrap Loader 用来搜寻类别的路径。该路径的修改与ExtClassLoader的相同。但修改后不影响Bootstrap的搜寻路径。

在命令列下参数时,使用–classpath / -cp / 环境变数CLASSPATH 来更改AppClassLoader的搜寻路径,或者用–Djava.ext.dirs 来改变ExtClassLoader 的搜寻目录,两者都是有意义的。


可是用–Dsun.boot.class.path 来改变Bootstrap Loader 的搜寻路径是无效。这是因为

AppClassLoader 与ExtClassLoader 都是各自参考这两个系统参数的内容而建立,当您在命令列下

变更这两个系统参数之後, AppClassLoader 与ExtClassLoader 在建立实体的时候会参考这两个系

统参数,因而改变了它们搜寻类别档的路径;而系统参数sun.boot.class.path 则是预设与

Bootstrap Loader 的搜寻路径相同,就算您更改该系统参与,与Bootstrap Loader 完全无关。

改变java.exe所使用的jre会改变Bootstrap Loader的搜寻路径。

Bootstrap Loader的搜寻路径一般如下:

///////////////////////////////////////////////////////////////////////////////////

D:myjavaj2sdk1.4.2_04jrelib t.jar;D:myjavaj2sdk1.4.2_04jrelibi18n.jar;

D:myjavaj2sdk1.4.2_04jrelibsunrsasign.jar;D:myjavaj2sdk1.4.2_04jrelibj

sse.jar;D:myjavaj2sdk1.4.2_04jrelibjce.jar;D:myjavaj2sdk1.4.2_04jrelib

charsets.jar;D:myjavaj2sdk1.4.2_04jreclasses

///////////////////////////////////////////////////////////////////////////////////////

更重要的是,AppClassLoader 与ExtClassLoader 在整个虚拟机器之中只会存有一份,一旦建

立了,其内部所参考的搜寻路径将不再改变,也就是说,即使我们在程式里利用System.setProperty()

来改变系统参数的内容,仍然无法更动AppClassLoader 与ExtClassLoader 的搜寻路径。因此,执

行时期动态更改搜寻路径的设定是不可能的事情。如果因为特殊需求,有些类别的所在路径并非在

一开始时就能决定,那麽除了产生新的类别载入器来辅助我们载入所需的类别之外,没有其他方法了。

下面我们将看一下载入器的委派模型

所谓的委派模型,用简单的话来讲,就是「类别载入器有载入类别的需求时,会先请示其Parent 使用其搜寻路径帮忙载入,如果Parent 找不到,那麽才由自己依照自己的搜寻路径搜寻类别」。

下面我们看一下小的示例:

public class Test

{

public static void main(String[] args)

{

System.out.println(Test.class.getClassLoader());

TestLib tl = new TestLib();

tl.start();

}

}

public class TestLib

{

public void start()

{

System.out.println(this.getClass().getClassLoader());

}

}


  如果这两个类仅放在dos命令提示符的当前目录下,则输出结果如下:

//////////////////////////////////////////////////////

sun.misc.Launcher$AppClassLoader@1a0c10f

sun.misc.Launcher$AppClassLoader@1a0c10f

//////////////////////////////////////////////////////

如果这两个类同时又放在<JRE 所在目录>libextclasses 底下(在我的机器上是:D:myjavaj2sdk1.4.2_04jrelibextclasses,classes没有,需要自己建),输出结果如下:

/////////////////////////////////

sun.misc.Launcher$ExtClassLoader@e2eec8

sun.misc.Launcher$ExtClassLoader@e2eec8

////////////////////////////////////

最后如果在<JRE 所在目录>classes下放入这两个类,则输出结果为

/////////////////////////////////

null

null

////////////////////////////////////

如果把<JRE 所在目录>classes下的TestLib删去,则输出入下:

//////////////////////////////////////

null

Exception in thread "main" java.lang.NoClassDefFoundError: TestLib

at Test.main(Test.java:7)

//////////////////////////////////////

这是因为Test的classLoader是Bootstrap Loader ,因此TestLib的也默认为是Bootstrap Loader。Bootstrap Loader搜寻路径下的TestLib被删去了,Bootstrap Loader又没有parent,所以提示找不到。

其他的情况可以自己逐个添加或删除文件,然后执行java Test进行测试,察看输出结果。

AppClassLoader 与Bootstrap Loader会搜寻它们所指定的位置(或JAR 档),如果找不到就找不到了,AppClassLoader 与Bootstrap Loader不会递回式地搜寻这些位置下的其他路径或其他没有被指定的JAR 档。反观ExtClassLoader,所参考的系统参数是java.ext.dirs,意思是说,他会搜寻底下的所有JAR 档以及classes 目录,作为其搜寻路径。



unto详解reflect Java的反射机制多方法实例教程next高性能JAVA代码之_内存管理和多方法实例教程
回复

使用道具 举报

4

主题

11

帖子

97

积分

积分
97
信息发布软件沙发
 楼主| 发表于 2016-9-25 11:18:08 | 只看该作者
多方法实例教程2


1.java执行


java.exe 是利用几个基本原则来寻找Java


Runtime Environment(JRE),然后把类别档(.class)直接转交给JRE 执行之后,java.exe   就功成身退。类别加载器也是构成JRE 的其中一个重要成员,所以最后类别加载器就会自动从所在之JRE 目录底下的librt.jar 载入基础类别函式库。所以在上图里,一定是因为java.exe 定位到c:j2sdk1.4.0jre,所以才会有此输出结果。


2.预先加载与依需求加载


像基础类别函式库这样的加载方法我们叫做预先加载(pre-loading),这是因为基础类别函式库里头的类别大多是Java 程序执行时所必备的类别,所以为了不要老是做浪费时间的I/O 动作(读取档案系统,然后将类别文件加载内存之中),预先加载这些类别会让Java 应用程序在执行时速度稍微快一些。相对来说,我们自己所撰写的类别之加载方式,叫做依需求加载(load-on-demand),也就是Java 程序真正用到该类别的时候,才真的把类别文件从档案系统之中加载内存



3.Java 提供两种方法来达成动态性


一种是隐式的(implicit),另一种是显式的(explicit)。


隐式的(implicit)方法我们已经谈过了,也就是当程序设计师用到new 这个Java 关键词时,会让类别加载器依需求加载您所需要的类别,这种方式使用了隐式的(implicit)方法。显式的方法,又分成两种方式,一种是藉由java.lang.Class 里的forName()方法,另一种则是藉由java.lang.ClassLoader 里的loadClass()方法。



4.forName方法


public static Class forName(String name, boolean initialize,


ClassLoader loader)


这两个方法,最后都是连接到原生方法forName0(),其宣告如下:


private static native Class forName0(String name, boolean initialize, ClassLoader loader)


throws ClassNotFoundException;只有一个参数的forName()方法,最后叫用的是:


forName0(className, true, ClassLoader.getCallerClassLoader());而具有三个参数的forName()方法,最后叫用的是:forName0(name, initialize, loader);initialized的用法:true,表示载入实例的同时也载入静态初始化区块;false,那么就只会命令类别加载器加载该类别,但不会叫用其静态初始化区块,只有等到整个程序第一次实体化某个类别时,静态初始化区块才会被调用。


档案:Office.java


public class Office


{


public static void main(String args[]) throws Exception


{


Office off = new Office() ;


System.out.println("类别准备载入") ;


Class c =


Class.forName(args[0],false,off.getClass().getClassLoader()) ;


System.out.println("类别准备实体化") ;


Object o = c.newInstance() ;


Object o2 = c.newInstance() ;


}


}


则输出变成:




5.用显式的方法来达成动态性:直接使用类别加载器



这种情形与使用Class 类别的forName()方法时,第二个参数传入false


几乎是相同的结果。


档案:Office.java


public class Office


{


public static void main(String args[]) throws Exception


{


Office off = new Office() ;


System.out.println("类别准备载入") ;


ClassLoader loader = off.getClass().getClassLoader() ;


Class c = loader.loadClass(args[0]) ;


System.out.println("类别准备实体化") ;


Object o = c.newInstance() ;


Object o2 = c.newInstance() ;


}


}


执行


java Office Word



6.自己建立类别加载器来加载类别


档案:Office.java


import java.net.* ;


public class Office


{


public static void main(String args[]) throws Exception


{


URL u = new URL("file:/d:/my/lib/") ;


URLClassLoader ucl = new URLClassLoader(new URL[]{ u }) ;


Class c = ucl.loadClass(args[0]) ;


Assembly asm = (Assembly) c.newInstance() ;


asm.start() ;


}


}


7.类别被哪个类别载入器载入


我们将上述的程序代码稍作修改,修改后的程序代码如下:


档案:Office.java


import java.net.* ;


public class Office


{


public static void main(String args[]) throws Exception


{


URL u = new URL("file:/d:/my/lib/") ;


URLClassLoader ucl = new URLClassLoader(new URL[]{ u }) ;


Class c = ucl.loadClass(args[0]) ;


Assembly asm = (Assembly) c.newInstance() ;


asm.start() ;


URL u1 = new URL("file:/d:/my/lib/") ;


URLClassLoader ucl1 = new URLClassLoader(new URL[]{ u1 }) ;


Class c1 = ucl1.loadClass(args[0]) ;


Assembly asm1 = (Assembly) c1.newInstance() ;


asm1.start() ;


System.out.println(Office.class.getClassLoader()) ;


System.out.println(u.getClass().getClassLoader()) ;


System.out.println(ucl.getClass().getClassLoader()) ;


System.out.println(c.getClassLoader()) ;


System.out.println(asm.getClass().getClassLoader()) ;


System.out.println(u1.getClass().getClassLoader()) ;


System.out.println(ucl1.getClass().getClassLoader()) ;


System.out.println(c1.getClassLoader()) ;


System.out.println(asm1.getClass().getClassLoader()) ;


}


}


执行后输出结果如下图:



从输出中我们可以得知,Office.class 由AppClassLoader(又称做System Loader,系统加载器)所加载,URL.class 与URLClassLoader.class 由Bootstrap Loader 所加载(注意:输出null 并非代表不是由类别载入器所载入。在Java 之中,所有的类别都必须由类别加载器加载才行,只不过Bootstrap Loader 并非由Java 所撰写而成,而是由C++实作而成,因此以Java 的观点来看,逻辑上并没有Bootstrap Loader 的类别实体)。而Word.class 分别由两个不同的URLClassLoader 实体加载。至于Assembly.class,本身应该是由AppClassLoader 加载,但是由于多型(Polymorphism)的关系,所指向的类别实体(Word.class)由特定的加载器所加载,导致打印在屏幕上的内容是其所参考的类别实体之类别加载器。Interface 这种型态本身无法直接使用new 来产生实体,所以在执行getClassLoader()的时候,叫用的一定是所参考的类别实体的getClassLoader(),要知道Interface 本身由哪个类别加载器加载,您必须使用底下程序代码:Assembly.class.getClassLoader()



8一切都是由Bootstrap Loader 开始 : 类别载入器的阶层体系


当我们在命令列输入java xxx.class 的时候,java.exe 根据我们之前所提过的逻辑找到了


JRE(Java Runtime Environment),接着找到位在JRE 之中的jvm.dll(真正的Java 虚拟机器),最后加载这个动态联结函式库,启动Java 虚拟机器。这个动作的详细介绍请回头参阅第一章。虚拟机器一启动,会先做一些初始化的动作,比方说抓取系统参数等。一旦初始化动作完成之后,就会产生第一个类别载入器,即所谓的Bootstrap Loader,Bootstrap Loader 是由C++所撰写而成(所以前面我们说,以Java 的观点来看,逻辑上并不存在Bootstrap Loader 的类别实体,所以在Java 程序代码里试图印出其内容的时候,我们会看到的输出为null),这个Bootstrap Loader 所做的初始工作中,除了也做一些基本的初始化动作之外,最重要的就是加载定义在sun.misc 命名空间底下的Launcher.java 之中的ExtClassLoader(因为是inner class,所以编译之后会变成


Launcher$ExtClassLoader.class),并设定其Parent 为null,代表其父加载器为Bootstrap


Loader。然后Bootstrap Loader 再要求加载定义于sun.misc 命名空间底下的Launcher.java 之中的AppClassLoader(因为是inner class,所以编译之后会变成Launcher$AppClassLoader.class),并设定其Parent 为之前产生的ExtClassLoader 实体。这里要请大家注意的是,Launcher$ExtClassLoader.class 与Launcher$AppClassLoader.class 都是由Bootstrap Loader 所加载,所以Parent 和由哪个类别加载器加载没有关系。我们可以用下图来表示:





这个由Bootstrap Loader   ExtClassLoader   AppClassLoader,就是我们所谓「类别载入


器的阶层体系」。



在此要请大家注意的是,AppClassLoader 和ExtClassLoader 都是URLClassLoader 的子类别。由于它们都是URLClassLoader 的子类别,所以它们也应该有URL 作为搜寻类别档的参考,由原始码中我们可以得知,AppClassLoader 所参考的URL 是从系统参数java.class.path 取出的字符串所决定,而java.class.path 则是由我们在执行java.exe 时,利用 –cp 或-classpath 或CLASSPATH 环境变量所决定。我们可以用底下程序代码测试之:


档案:test.java


public class test


{


public static void main(String args[])


{


String s = System.getProperty("java.class.path");


System.out.println(s) ;


}


}


输出结果如下:



从这个输出结果,我们可以看出,在预设情况下,AppClassLoader 的搜寻路径为”.”(目前所在目录),如果使用-classpath 选项(与-cp 等效),就可以改变AppClassLoader 的搜寻路径,如果没有指定-classpath 选项,就会搜寻环境变量CLASSPATH。如果同时有CLASSPATH 的环境设定与-classpath 选项,则以-classpath 选项的内容为主,CLASSPATH 的环境设定与-classpath 选项两者的内容不会有加成的效果。


至于ExtClassLoader 也有相同的情形,不过其搜寻路径是参考系统参数 java.ext.dirs。我们可以用底下程序代码测试:


档案:test.java


public class test


{


public static void main(String args[])


{


String s = System.getProperty("java.ext.dirs");


System.out.println(s) ;


}


}


输出结果如下:



输出结果告诉我们,系统参数java.ext.dirs 的内容,会指向java.exe 所选择的JRE 所在位置下的


libext 子目录。系统参数java.ext.dirs 的内容可以在一开始下命列的时候来更改,如下:



最后一个类别加载器是Bootstrap Loader , 我们可以经由查询由系统参数


sun.boot.class.path 得知Bootstrap Loader 用来搜寻类别的路径。请使用底下的程序代码测试之:


档案:test.java


public class test


{


public static void main(String args[])


{


String s = System.getProperty("sun.boot.class.path");


System.out.println(s) ;


}


}


输出结果如下:



系统参数sun.boot.class.path 的内容可以在一开始下命列的时候来更改,如下:




从这三个类别加载器的搜寻路径所参考的系统参数的名字中,其实还透漏了一个讯息。请回头看到java.class.path 与sun.boot.class.path,也就是说,AppClassLoader 与Bootstrap Loader会搜寻它们所指定的位置(或JAR 文件),如果找不到就找不到了,AppClassLoader 与Bootstrap Loader不会递归式地搜寻这些位置下的其它路径或其它没有被指定的JAR 檔。反观ExtClassLoader,所参考的系统参数是java.ext.dirs,意思是说,他会搜寻底下的所有JAR 文件以及classes 目录,作为其搜寻路径(所以您会发现上面我们在测试的时候,如果加入 -Dsun.boot.class.path=c:winnt选项时,程序的起始速度会慢了些,这是因为c:winnt 目录下的档案很多,必须花额外的时间来列举JAR 檔)。


在命令列下参数时,使用 –classpath / -cp / 环境变量CLASSPATH 来更改AppClassLoader


的搜寻路径,或者用 –Djava.ext.dirs 来改变ExtClassLoader 的搜寻目录,两者都是有意义的。可是用–Dsun.boot.class.path 来改变Bootstrap Loader 的搜寻路径是无效。这是因为AppClassLoader 与ExtClassLoader 都是各自参考这两个系统参数的内容而建立,当您在命令列下变更这两个系统参数之后, AppClassLoader 与ExtClassLoader 在建立实体的时候会参考这两个系统参数,因而改变了它们搜寻类别文件的路径;而系统参数sun.boot.class.path 则是预设与Bootstrap Loader 的搜寻路径相同,就算您更改该系统参与,与Bootstrap Loader 完全无关。如果您手边有原始码, 以JDK 1.4.x 为例, 请参考< 原始码根目录>hotspotsrcsharevmruntimeos.cpp 这个档案里头的os::set_boot_path 方法,您将看到程序代码片段:


static const char classpathFormat[] =


"%/lib/rt.jar:"


"%/lib/i18n.jar:"


"%/lib/sunrsasign.jar:"


"%/lib/jsse.jar:"


"%/lib/jce.jar:"


"%/lib/charsets.jar:"


"%/classes";


JDK 1.4.x 比JDK 1.3.x 新增了一些核心类别函式库(例如jsse.jar 与jce.jar),所以如果您测试时用的是1.4.x 版的JDK,sun.boot.class.path 内容应该如下:




9. 委派模型



如果您对整个类别加载的方式仍有所疑问,请容笔者重新解释一下之前程序


档案:Office.java


import java.net.* ;


public class Office


{


public static void main(String args[]) throws Exception


{



回复 支持 反对

使用道具 举报

4

主题

11

帖子

97

积分

积分
97
推广工具板凳
 楼主| 发表于 2016-9-25 11:19:00 | 只看该作者
多实例教程3

Java在需要使用类别的时候,才会将类别加载,Java的类别载入是由类别载入器(Class loader)来达到的,预设上,在程序启动之后,主要会有三个类别加载器:Bootstrap Loader、ExtClassLoader与AppClassLoader。

Bootstrap Loader是由C++撰写而成,预设上它负责搜寻JRE所在目录的classes或lib目录下的.jar档案中(例如rt.jar)是否有指定的类别并加载(实际上是由系统参数sun.boot.class.path指定);预设上ExtClassLoader负责搜寻JRE所在目录的lib/ext 目录下的classes或.jar中是否有指定的类别并加载(实际上是由系统参数java.ext.dirs指定);AppClassLoader则搜寻 Classpath中是否有指定的classes并加载(由系统参数java.class.path指定)。

Bootstrap Loader会在JVM启动之后载入,之后它会载入ExtClassLoader并将ExtClassLoader的parent设为Bootstrap Loader,然后BootstrapLoader再加载AppClassLoader,并将AppClassLoader的parent设定为 ExtClassLoader。

在加载类别时,每个类别加载器会先将加载类别的任务交由其parent,如果parent找不到,才由自己负责加载,如果自己也找不到,就会丢出 NoClassDefFoundError。

每一个类别被载入后,都会有一个Class的实例来代表它,每个Class的实例都会记得是哪个ClassLoader加载它的,可以由Class的getClassLoader()取得加载该类别的ClassLoader。

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关导读
群发软件手机改了分辨率后有误差用公式计算加减还原点击
有的人用改分辩率软件,更改了手机的分辩率,为了让所有手机通用一种点击方法,计算偏差,可以用这段代码实现。两种方法如下:第一种方法:function calculateFunction(inputValue) { function leastSquaresFit(x, y) { var n = x.length; var sumX = 0; var sumY = 0; var sumXY = 0; var sumX2 = 0; for (var i = 0; i < n; i++) { sumX += x;
群发软件原生webview的h5如何跟aiwork交互
原生webview的h5如何跟aiwork交互 原生activity和h5交互案例.zip void runJs(function code)h5执行app JS脚本window.at.runJs(function (){ //这里写ATjs代码 printl("你好"); auto.home();}.toString());void runJsFile(String file) H5运行APP JS文件window.at.runJsFile('主脚本.js');void callFunction(String funname,String arg) H5执行脚本方法window.at.callFun('main',"hello");Str
群发软件AIWORK软件图片二值化封装使用方法说明
群711841924// 引入 Android 和 OpenCV 的类 importPackage(org.opencv.core); importPackage(org.opencv.imgproc); importPackage(org.opencv.android); importClass(android.graphics.Bitmap); function screenshotAndBinarize(width, height, quality, threshold1, threshold2) { // 进行屏幕截图 var bitmap = screen.screenShot(width, height, quality).getBitmap(); // 将 Bitmap 转换为 OpenCV
群发软件使用AIWORK的ADB命令执行: 实现安卓设备的远程命令
第一个例子:开启代理模式判断agent.start()agent.start() 函数用于开启代理模式,需 root 权限,无需参数。此函数执行后会返回一个布尔值:如果成功返回 true,否则返回 false。下面是一个可能的使用例子: // 尝试启动代理模式 let result =agent.start(); printl(result); if (result) { console.log("代理启动成功!"); } else { console.log("代理启动失败,请检查是否具有root权限。"); } 此
群发软件理解Activity:安卓应用中的关键组件
在安卓开发中,Activity 是一个非常重要的组件,主要用于以下几个方面:用户界面展示:每个 Activity 通常代表一个完整的屏幕或界面,用户与应用的交互主要通过 Activity 实现。例如,一个邮件应用可能包含一个显示邮件列表的 Activity,以及另一个用于阅读邮件内容的 Activity。生命周期管理:Activity 有一个生命周期,即创建、启动、恢复、暂停、停止和销毁等状态。开发者可以通过重写
群发软件AIWORK全能图像处理开发指南:从截图采集到OCR识别的全链路实现
1.截取屏幕的全屏截图:var img = screen.screenShotFull(); 这行代码用于截取当前屏幕的全屏截图,并将截图存储在变量img中。2.文字识别,默认语言为中文:var ocr = img.MLKitOcr('zh'); printl(ocr.getJsonString()); 使用MLKitOcr方法对截图img进行文字识别,指定语言为中文’zh’,并将识别结果以JSON字符串形式打印出来。3.获取图片大小(以字节为单位):var size = img.byteSize(); printl('图片大小: ' + size + ' 字
群发软件AIWROK软件中的okHttp上传文件详解
以这个网站为例子https://ocr.wdku.net/我们首先抓包上传的参数通过以上抓包我们分析出 几个关键点第一:上传的url是 https://ocr.wdku.net/upload第二:二进制的参数名字是 file第三:其他参数user,name,from,fileName现在使用okhttp上传方法以此填写参数var http1=new okHttp(); var fromdata= new map()//其他参数使用map格式 fromdata.add("user","default") fromdata.add("name","t019bf9f2ac19af88b0.webp.png_173915
群发软件通过HTTP接口实现屏幕连续点击功能的易语言代码示例
.版本 2 .支持库 eHTTP .程序集 窗口程序集_启动窗口 .子程序 _启动窗口_创建完毕 .子程序 发送HTTP请求 .参数 请求URL, 文本型 .局部变量 响应内容, 文本型 // 创建HTTP请求对象 HTTP请求对象 = HTTP请求 () // 设置请求URL HTTP请求对象.设置URL (请求URL) // 发送GET请求 响应内容 = HTTP请求对象.发送GET () // 显示响应内容(可选) 信息框 (响应内容, #信息图标, “响应内容”) .子程序
群发软件实现AIWork软件开机自动启动且不弹出界面
这个代码的主要作用是,手机一开机就自动不弹界面,自动开始运行脚本,如果你想定时脚本,也是需要先打开脚本的,这个需要自己在主脚本的JS运行才可以// 自启动逻辑if (autoStar == true) { printl("开机自启动"); Import("主脚本.js");} else { // 加载主界面 var win = window.loadUI("主界面.ui"); win.show();}这段代码主要用于设置一个应用程序在开机时是否自动启动。代码逻辑如下: [*]代码首先检查变量 autoS
群发软件AIWORK+图鉴:点选验证码智能识别系统集成指南
详细版:function sendImageToAPI(username, password, typeid) { var url = "http://api.ttshitu.com/predict"; // API地址 // 截取全屏图像并裁剪验证码区域 var img = screen.screenShotFull().cutImagePercent(0.17, 0.412, 0.83, 0.57).toBase64(); // 准备POST请求的数据 var postData = JSON.stringify({ username: username, password: password, typeid: t
群发软件MuMu 模拟器借助 ADB 桥接与 AIWROK 软件成功连接的步骤详解
MuMu模拟器桥接ADB模式连接AIWROK软件教程:他模拟器官方网站:https://mumu.163.com/ 第一步准备工作, 同时开多个模拟器会导致端口冲突,新手先折腾一个,成功后再试多开。 如果之前开过其他模拟器(雷电、夜神等),先全部关掉!先确定你这里只有一个模拟器,因为多个,他可能端口不同的,一个连接上了,其它也能链接上,最好是先一个先折腾着,这样后面就简单了。 然后开启他的网络桥接状态。打开MuMu模拟器 → 点击右上角
群发软件JavaScript中贝塞尔曲线的实现与应用
随机数生成函数 function random(a, b) { return rand.randNumber(a, b); } /** * @param time_ms {number} 执行时间 ms 例如 3000 * @param t {number} 间隔系数 0-1 间, 越小线条线条越圆润,计算量越大, 例如 0.005 * @param pt {number[][]} 控制点坐标的二维数组 例如 [[137,169],[140,283]] */ function bezier(time_ms, t, pt) { var gesture1 = new path(); // 创建一个手势对象 gesture1.se
群发软件键鼠.随机百分比点击方法结合屏幕百分比和随机偏移,实现精准且自然的
第一个,键鼠HID随机点击例子const 键鼠 = {}; 键鼠.点击 = function (x, y) { if (typeof x === "undefined") return false; if (typeof y === "undefined") return false; return hid.click(x, y); } 键鼠.随机点击 = function (x, y, random) { if (typeof x === "undefined") return false; if (typeof y === "undefined") return false; let random_s = random || 10; let x
群发软件应用关闭函数的设计
第一个:定义一个关闭当前窗口的函数// 定义一个关闭当前窗口的函数 function close() { // 本示例创建一个带有一个按钮的窗口,点击按钮关闭当前窗口 // 初始化一个新的活动(窗口) var ac = new activity(); // 加载布局代码,使用 LinearLayout 替换 vertical ac.loadXML(` <LinearLayout> <Button id="button1" text="第一个按钮"/> </LinearLayout>
群发软件多点屏幕颜色检测:10秒内变化监控
群发软件智能链接:在安卓上无缝切换快手与抖音
1.这是一段快手的意图跳转例子// 导入包 importClass(Packages.android.content.Intent); importClass(Packages.android.net.Uri); importClass(Packages.android.content.ActivityNotFoundException); importClass(Packages.android.widget.Toast); importClass(Packages.android.os.Handler); importClass(Packages.android.os.Looper); // 设置快手用户页面的URL var userId = "2037335125"; var url = "kwai://prof
群发软件在AIWROK软件中使用OkHttp设置HTTP请求头中的Cookie并输出
群发软件监听广播事件:onBroadcastEvent 方法详解
本帖最后由 群发软件 于 2025-1-16 09:43 编辑 event事件侦听使用 onBroadcastEvent 方法的示例:// 监听广播事件 event.onBroadcastEvent(function(msg) { // 在接收到消息时打印出来 print(msg); }); 说明:onBroadcastEvent 是一个用于监听广播事件的方法。它接收一个函数作为参数,该函数会在事件触发时执行。在这个例子中,当收到消息时,打印该消息。这个示例演示了如何实现一个简单的事件监听
群发软件自动下载与安装:多线程管理指定文件夹APK和图片文件的下载完整性检查
自动下载与安装:多线程管理指定文件夹APK和图片文件的下载完整性检查
群发软件用AiWork如何写出一个一个播放器呢?
用AiWork如何写出一个一个播放器呢? 用软件可以写出一个简易的播放器,专门听歌甚至占用内存极少,极度容易的播放器例子。 传到手机只需要播放就可以了。这个如果您希望从一个MP3列表中逐个播放文件, 您可以先创建一个包含所有MP3文件路径的数组, 然后使用循环或递归的方式来遍历并播放这些文件。这里是一个示例代码,展示了如何实现这一功能: 这段代码首先定义了一个mp3List数组, 包含了您想要播放的M
群发软件蓝奏云-文件下载(2.8.9版本)
群发软件自动留言工具下载
自动留言工具下载,这个软件可以自动评论这四个网站,也是新加新收集回来的,不过这些网站虽然可以匿名评论留言,放网址,放宣传的关键字,但却有一个验证码,这个验证码吧,你整起来是可以识别的,但没有必要,还不如自己对接火眼这些打码网站来的实在,现在人工智能也可以识别验证码了,而且准确率比普通的打码网站更高,甚至可以给出更好的图片修复技术,也算是一个人工智能的一个彻底应用层级吧,有可能 GPT5 后面连视频验证码
群发软件自动网址转换自动提交蜘蛛池软件
自动网址转换自动提交蜘蛛池软件,增加二个标题作为宣传目标的网站,它们可以自动的增加标题作为关键字和宣传联系方式,然后通过微信读书和微软的这个软件搜获功能,将网址转换成宣传链接的地方的,目前这两个网址是有效的,收录快,后面也做了一个蜘蛛池的扔投喂,也就是发着发着,他会自动的去发一个所有网址,然后清空所有网址,每次只有两个作为提交的作用,能达到发外链,投哺蜘蛛池的效果的,也就是这二个现在有效果的,提交
群发软件自动评论网站全自动发帖软件
自动评论网站全自动发帖软件,这个软件增加七个可以自动评论的网站,效果还蛮好的,他们都是相似后台的,有几个还是极高权重的留言网站,打开网址,可能不是直接的发帖顶帖的输入框,但是只要加一个点击发言就可以进去评论了,网站自由度比较高,可以发自己的标题和内容,也可以发一些外链上去,收录都极高,都不用发帖都可以有很高的权重网站,都是这些实际的网址才行,有的同一个网站,收录不一定好,但有的帖子浏览量高,发帖权
群发软件2025新版本自动评论自动提交蜘蛛池软件
自动评论自动提交蜘蛛池软件,今天因为网站过时,更新三个更加时效的网站,他们都可以自动的在收录比较好的帖子增加收录,你可以在这里刷广告,也可以在这些地方刷外链,都可能被秒收录的节奏,这些评论,往往都是他们自己刷了几千万条的外链,刷了几千万条的广告信息留下的繁殖链接区域名,网站收录好才是真的亮眼的地方,打卡一下就可以收录,不记录权重,只看最终的百度收录效果吧,这些网站是实时放一些收录的热门帖子评论效果
群发软件精英乓乒网全自动发布帖子软件下载
精英乓乒网自动发帖软件,这个网站客以久了,居然还可以发帖,吸引来了一群人盯在它的网站进行发帖子,不过现在不论是买号发还是什么号,都给安排上了二个验证码,登陆一个会动的验证,好在登陆成功一次后,后面不用,不过他的发帖一个是回答问题的验证码,一个是会动的验证码,会动的验证码识别率不是很高的,毕境他有时候会截图和会动的那一秒时候进行了切换图片,这样就可能导致截图不成功,这么久了,所有平台对这些会动的验证
群发软件百度贴吧全自动群发软件下载
百度贴吧软件,这个网站发帖是比较难的,但效率可以说全网最高的,所以总是有一种日不落的帝国感觉,三到二头,都会有人拉出来软件跑一跑,这个网站也是蛮折腾的,有时候严格,有时候松驰,导致有的人专靠这个吃饭的,总是有一种吃不到葡萄说葡萄酸的感觉,这个脚本用 POST 把图片上传上去,然后按照自己需要,弄成了图片成文字组合,很明显的软文结构,能上去一遍不被收录也无所谓,一样人气满满的在上面生根发了芽,有委大的人气
群发软件策梅特博客自动发帖工具下载
策梅特博客群发软件,这类博客网站可以用最简单的代码实现自己的博客需求,以前是先流行的,现在只能被当作新手的训练场了,这种博客需要自己购买登陆账号才可以发的,只有一个登陆,一个发帖界面,首页是实时更新的,发什么就实时更新什么,这类网站都有新手保护期,即你前期发什么都容易收录,后面就没有可以发展的条件了,网站发帖快,没有什么阻碍的地方,收录也是实时提交的,他们都开通了后台对接的,所以发帖收录不用另外提
群发软件apipost博客群发软件
apipost博客群发软件,这个网站是 POST 发博客的地方,注册账号要邮箱验证码,注册后想发博客还要手机验证码的,绑定一次后就可以发帖,发帖的时候有一个按住验证码,刚好软件也有这个功能,按住五秒就可以实现过这个验证码的样子,没有啥难度,就是账号可能比较麻烦一些了,软件可以自动登陆账号,然后打开发博文的网页,再按住验证码识别成功后,输入标题内容,群发博客的任务就这样完成了,这个软件可以自动切换账号去发帖,发
群发软件aliexpress产品网站发布宣传软件
aliexpress产品发布软件,这个是外贸产品供应信息发布网站,对于国外的 B2B 网站可能还在发展阶段的,所以网站对于这些还是比较吃香的,aliexpress.com 这个网站是一种分类比较强大的网站了,他们国外的,还是比较注重细节分类的,所以会有很多地方需要调试,不过网站也提供了一 键复制属性的功能,和以前机械网站一样,因为他们分类那种细节都到了螺丝纹度的,如果用属性复制功能,会比较简单,只要改一改标题,图片,和视频就可
群发软件51搜了网发布宣传软件全自动发布帖子软件下载
搜了网资讯产品自动发布软件下载, 这个软件可以自动发产品,产品这里是发家电维修类别的,比较复杂一些有几十个选项要填的,第一次做这个网站,你会感觉到头皮发麻,不知所措,很多下拉什么的都要逐个调试,图片这里还要上传六张图片,不然会出错,发不出去的,第二个选择发帖项是资讯的,以前有验证码,现在全部可以不用验证码自动发帖子,轻轻松松就可以发完导入的所有内容帖子,再也不用填那个计算的验证码了吧,网站收录还是
群发软件抖音图文和视频发布工具下载地址
抖音图文发布和抖音视频自动上传软件,这个软件可以自动上传抖音图片并且附上文字和获取图片的各种各样名称作为标题进行发布,有的人账号似乎拖动不了网页,只好出这个座标点击的版本,这样就不会有啥问题了,他是可以准确定位到上传按钮,并且准确的输入内容作为标签,这样就可以发上去的内容标题带上标签关键字,带上账号切换功能,妥妥的是一个宣传视器,用这个软件发布的视频和图文,基本不会被封号,只要你发的不是太快,发的
群发软件发布宣传软件自动评论留言软件
增加四个评论网站发信息,这里三个网站是一样的,另一个网站比较特别,是一个下载站的评论,还是极少有网站有这么自由的,不过正因为他们秒发秒收录的极致才会被看中选择,一个是鞋袜网站,一个叫懒人计算器网站,一个叫生活养生 70 条,还有一个叫微导航网站,这个网站没有验证码的,全部自由发挥,只要秒发秒显示的,不用审核,另外三个网站也是有三条链接收录比较好,其它自创的收录是不行的,他这些留言网站,只针对收录好的某
群发软件易次元图片发布头条软件
易次元图片发布头条软件,这个网站可以说是动漫不变的话题,他们总是会创作出各种各样的人气话题,所以这个网站收录一直是一个重点关注对象,只是这个网站也是确实管的极度严格的,不管你是在里面创建小组,还是去增加图片相册,或是直接发帖,都有可能被百度收录,这个网站一个号只能发五帖,就自动切换账号了,不过要是出验证码就没有好的法子了,他这个验证码,拖对了也会经常判断你是错的,所以滑动方法是没有问题的,只是人也
群发软件OOKT百科网站发布宣传软件
OOKT百科网站自动发布软件,这种头条新类网站就是以前的 ZBLOG 的模块,这类网站搭建容易,也比较安全,没有什么大的漏洞,主要是简单稳定,只要服务器还可以,几乎不会出什么差错,这个网站也是养熟了,然后出来放号出售的,这类网站做好了后,收录几乎都不会差到哪去,都比较好的百度收录效果,买好账号添加到软件的账号密码列表,导入标题内容自动发帖,这个网站的分类会比较麻烦一些,主要是他这个嵌套的操作代在码有一点编差
群发软件星空社区全自动B2B发帖软件
星空社区全自动B2B发帖软件,这个网站是 B2B 后台的样子,做了二套网站,一个是针对普通网页版本进行发帖的,一套是 POST 后台发帖的形式,这样就可以自动的拥有二种模式,一个是发的快,一种是收录好,有的时候你就像是在这些地方做有用功似的,你把能量传递过去就会得到两种效果,看你怎么选择,有蜘蛛池的时候,当然是用自己的 POST 版本了,要是没有就用普通的版本浪费点电能,一定要传二张以上的图片,图片不要超过 3M 比较好
群发软件鸡病专业网论坛全自动发帖软件
鸡病专业网论坛全自动发帖软件,这是一个发外链的论坛哈,你要把链接放到软件列表的内容 2 和内容 3 已经加上了白底了,正常内容可以放在内容 1 这样就可以做到悄悄进村,打枪的不要了,这个软件是先采集整个版块的网址,放到列表中去,每一次都会有一个大循环,重复操作,为什么要这样弄呢,因为这个脚本只是顶帖用的,没有什么大的效果操作,顶的太快被发现了可能就是一顿乱封号处理了,论坛有点被全部扒下来顶的感觉,发链接不
群发软件gongkong网早自动论坛顶帖软件
gongkong网早自动论坛顶帖软件,现在发帖太多限制了,很多人把目光转到这些大论坛,进行了偷偷发外链,怎么个方法,其实要是你查到了这些人的外链就很明白是怎么弄的,就是把自己的网址,弄成白底颜色这样操作,这样管理员是看不到你发了网址一堆的在下面的,加上现在人都很少有查询的,只要不是很过份,基本都可以发很久,就像现在这个论坛一样,看了很多人都在偷偷的发一些蜘蛛链接在里面,这样就可以造成迷糊的操作了,这个软件
群发软件盐城商务网全自动发布帖子软件
盐城商务网全自动群发软件,这个网站是 B2B 网站来的,买号才可以每天发几百条,要是加上现在的蜘蛛池技术,收录还是很可观的,要是没有蜘蛛池就会收录的极少了,这个软件包有二个功能,一个是 POST 的后台发送,能全自动看不到过程,只有过程日志呈现,另一个是普通的版本,能看到运行过程,第一个脚本是占用资源是比较少的,另一个显示过程的肯定就加载的东西自然就多,网站有五个分类可以发,全部都导入到软件里去了,你只要操
群发软件自动网站评论软件下载地址
后台评论更新五个网站打包,这几个网站只有一个后台是不同的,其余的都是帝国的 CMS 系统,后台和验证码都一样的,网站的验证码都几乎一样,可以用图鉴这个网站打码比较便宜一些,都不需要注册账号,匿名就可以评论,他显示的是 IP 进行的,验证码也可能会打错,不管这个只好按出错率判断了,五个网站,第一个要不肜填写标题,其余几个都要填写标题,标题带联系方式就行了,后面的这四个网站可以填写内容,他们主要不是收录当页,
群发软件扬中头条自动发布软件
扬中头条自动发布软件,这个网站做提极度粗糙的,连网站原来的 LOGO 都没有换掉,可是你更气的是,他收录居然出奇的好,你这能找谁说理去,不过网站他主站是比较多有价值的东东的,可发帖自然也有一个原始的验证码了,导入账号可以换号的,软件都已经做进去了,好在激活不用这么麻烦,注册一会就可以发帖,本来做了全自动发帖的过程,但注册还是有失败率,因为这个验证码也不是百分百过,要是自己写逻辑自己用的还是可以的,不过要
群发软件阴山论坛网站群发软件
阴山论坛网站群发软件,这个网站是论坛来的,改了很多地方,基本你找不到哪里发帖,哪里回帖子,网站图片也乱七八糟的,不过也没有关系了,反正能收录很多就行了,网站注册账号是免费的,注册一个账号要二分钟后才可以发帖,只要注册的号导入进去软件的 ID 列表,就可以全自动切换账号发帖,完全不用理,导入标题内容会自动切换的,没有什么需要手工操作的,不过发帖有一个验证码,需要自己充好火眼这些接口,也是会自动打验证码的
信息发布软件自动提交宣传内容自动提交蜘池软件
自动提交宣传内容自动提交蜘池软件,这个脚本是集合了四个搜索留下关键字和联系方式的方法,然后会把搜索的链接保留下来到列表中去,所有网站跑完了后,就会自己跑去蜘蛛池里留下刚才搜索的痕迹,全部链接会丢进去让他爬行一次,输入标题和网址,再次提交完链接进行循环操作,这样的好处就是成本极低的效果了,都可以自动提交链接进行步前进,每次的链接都会自动清空,搜索那边,最好导入多点标题,标题加联系方式,就是关键字和联
信息发布软件咔嚓娱乐网全自动发布软件
咔嚓娱乐网全自动发布软件,这个网站可能是很久以前的后台了,现在具然还有人拿出来用用的,也是很这神奇的事,网站这家伙,不管什么白猫黑猫能有收录好的帖子就是好家伙,不管网站丑还是美的,一切都不重要,重要的是看他有没有货在肚子里,有时候你也不知道怎么收录就狂上去了,还好有点规律可以寻到,就是发帖多了,自然会有这样那样的超级收录在里面上去的,网站只要有号就可以发,导入标题内容,有的人还会在内容加点图片,不
信息发布软件大发游戏网自动发布帖子软件
大发游戏网自动发布帖子软件,这个网站是一种游戏 APP 下载,然后是在后台发文章投稿的方式进行发帖的,这类网站肯定要买号才可以发的,不然你连他的后台在哪里都会不知道,下载的网站都自动流量,会弄的人很容易就能把网站收录拉起来的,只是很多东不知道这些技巧罢了,网站发起帖子还是比较简单的,就是输入标题内容,再传一个缩略图片就可以发成功,简单莫过于此些操作了,网站需要自己准备好账号,导入标题内容就可以无限的发
信息发布软件扎屯网全自动发布帖子软件
扎屯网全自动发布帖子软件,这个网站是 B2B 网站,全自动发布的时候会快一些,不过号都是要和他买后才可以发帖的,做二个版本,一个是 POST 版,一个是普通网页版,名子可能会比较偏,但收录只蛤帮搜狗的样子,百度收录比较少,他们这些网站打的就是批量,有收录就留下,没有收录可能被隔一定的时间被 K 掉,会网站打不开,也可能是网站对他们不再报希望了,所以网站也不会留下的。网站没有啥可以的亮点,都是导入账号密码,导入标
信息发布软件中国路面机械网全自动发产品信息软件
中国路面机械网全自动发产品信息软件,这个网站注册一个账号,完善公司信息就可以发帖,不过网页端是登陆不上去账号的,点提交都不可以登陆上去的,在浏览器也无反应,不过好在找到了 手机端登陆网址,这样就可以登陆成功账号,然后返回到电脑的页面上去的,发产品这里还是比较麻烦的,要选择分类,要选择城市等信息,产品页面里还要填一个图片地址,算是比较麻烦的地方了,网页内容输入这里有检验的,一般内容说不给发的,标题也
信息发布软件嘉泰姆网自动评论软件
嘉泰姆网自动评论软件,这个脚本集合了五个网站,他并不是每一个网站都有效果的,而是某几篇文章,收录好的就越来越好,收录差的你评论进去也不会有收录,他们自动收录的网站看中的也这点,开出某几朵花很难,但种草却很容易,想收录好只能跟着这些收录过的帖子进行后续补上,如果你想主帖收录,那就只能等他们展开蜘蛛的爬行量了,这个网站输入账号密码就可以发帖,他也是一种自动注册的状态,评论的时候需要输入验证码,随便用打
信息发布软件中国象棋网全自动群发软件
中国象棋网全自动群发软件,现在对于这些网站评论收录极好,几乎占了现在收录的大头,他们收录是主网页帖子的某个评论窗体,收录的是当前某页面,然后定位里面的关键字,定位里面的收录内容和联系方式进行的,这些评论网站有一个共同点,就不需要账号,只要输入一个验证码,就可以拼了老命去评论网站内容的,这里第一个网站是手机网页来的,其它三个都是帝国新闻网站后台,每一次循环一圈过去,识别验证码方式,价格比较便宜的,只
信息发布软件JAYI定制版后台群发软件
JAYI定制版后台群发软件,这种网站是一种批量的网站,自动用 AI 写文章,自动群发起来的网站,他们可以让很多网站互相窜连起来的样子,而你要做的是增加网站的内容,他们通过几千个站群转发你发过的文章,相当于一站式服务了,他弄这样的一个后台给你看上去很复杂,实际只需要添加标题关键字和正文就可以了,外链什么的网站肯定会帮你转发的,没有效果别人也不会买这种站群服务的样子,做这些网站不用弄那么多的限制的,只要写入缓
信息发布软件小红书图文发布宣传软件
带标签版小红书图文群发,小红书一直有一个很严重的毛病,就是带标签极度麻烦,而抖音就对这个功能比较看重,你粘帖进去,加一个回车或是空格是可以出来标签的,这个标签看似很小的一件事,却是视频关联播放,视频相关播放量,视频搜播放量的关键字,小红书这么多年以来,终于看到了这个差距,有所改变,现在他们也弄成了这种功能,这样可以让软件也输入慢点,加一个空格去,也能实现标签呈现效果的结局点,现在软件这个版本可以对
信息发布软件51搜了网全自动产品和资讯群发工具
51搜了网资讯和产品全自动发布软件,这个网站是要钱买号发的,资讯以前他是死要弄一个验证码的,现在倒是改进了不少,主要是登陆框和产品发布和时候,不再要求什么多少星才可以发布了,也确实是如此,你不改变,这社会让你吃上几次亏让你改变的,为什么人家要花多点钱和你瞎扯呢,还不如找一个心意顺意的网站发一些帖子好,其实这些网站都是被百度控制进去的,完全不是我们想象的那么美好的事,收录都是有指标的,其它都是随机的呈
信息发布软件入库网POST版本B2B网站群发工具
入库网POST版本全自动群发软件,这个网站看上去 LOGO 啥都比较新鲜,其实只是一个 B2B 网站来的,你登陆后台就会看到他的全部效果了,现在做两个版本,一个是 POST 版一个是普通网页版,规则利好大家都懂的吧,网站也没有什么新奇的,前期收录肯定好一些,后面收录肯定也不会持续多久,网站主现在弄了几百个网站,挑一些好的放上去,不好的就会慢慢下架,或是改名,全部弄成了一些原来的样子了,导入标题和内容就可以全自动的发帖
信息发布软件评论网站自动软件下载地址
三个评论网站集合,这里两个网站都是帝国评论的系统,可能是故意为之的评论权限,像这种这么超大的评论网站后台能收录,也实属很罕见的了,他们评论可是有很大收录量的地方,你搜这些里面的手机号码或是 QQ 号,都会被单独的收录起来,看域名你就会觉得不那么奇怪了吧,这些都是暂时可以立即见效的网站,这类网站也是需要自己找到这些评论帖子可以执行的网站,网站打开是有验证码的,很简单的打码,还是对接打火眼比较好一些,毕竟
信息发布软件明珠网POST发帖工具下载
明珠网全自动发布帖子软件,这个网站做两个发帖过程,一个是 POST 的,一个是普通版本,现在 POST 版本是电脑差的标准配置,不过效率还是非常高的,要是自己能弄几个这样的网站,加上收录好的,是一笔不错的收录量,只可惜很多笨人根本看不透这些事,还拼了命的去找网站发,自己养几个网站效果是很多找网站的几十倍,不过很多人也不珍惜这样的机遇,因为网站前期都有很高的收录量保护期的,一旦不把握好这样的新手村效果,就变的无
信息发布软件天龙新闻网全自动发帖软件
天龙新闻网全自动发帖软件,这个是 B2B 网站,有的人找不到网站的自然能看上这类网站自动发帖的,因为都简单,导入标题内容,充好账号的积分,就可以全自自动的发帖,不用太多的干扰就行了,网站只有资讯和文章二个分类可以发,账号充的会员过期会发帖不了,虽然只能发两个分类,不过都已经把分类给做到脚本里的,他们对应分类会进去选择分类,或是上传图片了,输入标题内容都是通用的,添加产品这些网站不让发,打开也是没有用的
信息发布软件脉脉账号挂机软件下载
脉脉自动挂机注册账号软件下载,这个脚本是注册脉脉账号的,用了豪猪的接口打码,还有椰子接口打码,二个差不多,哪一个有账号就拿哪一个用,要注意的是猪这个接口账号一另一个网站不一样,他是加密后的账号密码,一般人记不住,只能用普通账号进去网站后,点 API 账号进行获取,得到手机号码后,才可以进行注册用,注册账号后,会采集账号的缓存,这样就可以后面发帖使用啥的,比较简单,也是相当麻烦的脚本,看上去是普通的与注
信息发布软件乐搜网全自动发帖工具
乐搜网全自动群发软件是一款非常好用的工具,它能够帮助用户轻松实现信息的群发和帖子的发布,提高工作效率和传播效果。用户对该软件的评价也非常高,认为它是一款值得信赖和使用的工具。 乐搜网全自动发帖工具下载: 乐搜网全自动群发软件作为一款功能强大且用户友好的工具,不仅极大地简化了信息传播的过程,还通过其多样化的功能满足了不同用户的特定需求。该软件支持多种类型的信息群发,包括但不限于文本、图片以
信息发布软件揭阳优聘自动群发工具下载
揭阳优聘自动群发工具下载,这个网上右上角有联系电话号码,你要发帖就只能找他免费给你发送,发帖有验证码,会员应该都不需要会员就可以发帖,比较简单,做起来步骤是比较多的,但效果还是很好的,采集地多发送,只能发到他这个网站所在地,固定的,虽然标记是地区的,但其实全世界也可以访问进去的,百度收录的也有 N 多,全部是有效信息,网站对这些发帖删的极少的存在,网站没有什么大的限制,只是发帖容易一些收录,他网站主
信息发布软件GPT4文章生成器软件
一直有人问我用文章怎么自动生成器操作,这个软件脚本就可以自动群发文章生成器作用,他是对接 GPT4.0 生成的,而且是最新的接口,他这个网站接口还是基本稳定的,不管怎么整,他都还在,也经过历史的检验了,这个脚本已经是去年做的,拿起来直接现在还可以用,说明还算稳定了,现在增加一个接口选择,他接口是一个字母代码的,也加上了清空会话,不然网站会发现在弄了太多会话,会有可能把你的号给封了,是一个变态的操作,如果一
信息发布软件816商务网全自动发帖软件
816商务网全自动发帖软件,这个网站也做了两个版本,一个是低配版,POST 提交,可以自动传图,自动切换标题和内容,导入账号就可以用,另一个是能看到界面的,也是导入多标题多内容组合发出去,一个是占用资源只有几 M,一个要渲染网页 CSS 和 JS 自然要用的资源多一些,现在也是很大的证明,如果网站没有对接百度蜘蛛池的,可能收录不如普通的版本,因为他不会执行百度的那几个 JS 文件,普通版当然就是模拟发帖的,自然会执行所
信息发布软件第一枪网站发布帖子B2B网站群发工具
第一枪网站发布帖子B2B网站群发工具,这个网站和普通的 B2B 网站没有什么大的区别,注册需要上传营业执照和手机短信验证码的,比较正规的那种,这个脚本可以发展会管理,可以发资讯管理,还可以布产品信息,软件登陆有一个拖动的验证码,会比较麻烦,所以这个软件是采用了缓存登陆的方式进行,发布帖子前一定要先采集一次缓存,这样就省去了每天跑去手工登陆账号的麻烦事。导入标题好内容,这样就可以省去一些麻烦事,软件能自动组
信息发布软件搜巴巴全自动群发软件
搜巴巴全自动群发软件,这个是同城分类信息网站,这类网站是 N 年没有更新的了,虽然漏洞比较多,但现在随着病毒终结,杀软也没有再去折腾这些事,现在毒与杀是存在这种微妙的关系之中,这个网站发的是商务同类信息,其实和 B2B 网站也没有多大的区别,网站给钱就可以发帖,自己可以充值套餐,反正这些网站是收录好,就发出去让别人充值一把作为建网站的收获期吧,这类网站有的收录好,有的是收录差的,不过新网站短期爆发收录好,
信息发布软件本地生活网全自动群发软件
本地生活网全自动群发软件,这个网站是本地生活的网站,他主要是发家电维修类的内容比较多一些,还有一些是商务服务类的信息,这类网站现在收录好的,也就那么几个,后来者往往很难居上了,他们都大多数是收费模式,给多少钱发多少帖一天。网站登陆是普通汉字验证码,发帖有分类,电话号码和发帖标题已经调用在标题上面了,发多少帖子这个按钮调用也是有用的,简介和地址分别有列表调用,你只需要导入进去就可以了,这个上传图片也
群发软件首码项目网发布宣传软件
首码项目网全自动发帖软件,这个网站是一种后台头条模式的,他有点像 ZBLOG 形式,很多人是没有啥动力放弃一些收录不好的网站,而总是舍又不舍得,放弃又还是在发帖,变成了一个一个背包,越积越多,效果越差,这里建议的是,三个月收录不好的网站就扔了,你可以很多模板,有时候你做对了很多事情,但因为百度蜘蛛就是和你斗气,看不上你的域名,看不上你的服务器,就会不收录,是完全不收录的那种状态。那就果断换域名,换服务器

QQ|( 京ICP备09078825号 )

本网站信息发布软件,是可以发布论坛,发送信息到各大博客,各大b2b软件自动发布,好不夸张的说:只要手工能发在电脑打开IE能发的网站,用这个宣传软件就可以仿制动作,进行推送发到您想发送的B2B网站或是信息发布平台上,不管是后台,还是前台,都可以进行最方便的广告发布,这个广告发布软件,可以按月购买,还可以试用软件,对网站的验证码也可以完全自动对信息发布,让客户自动找上门,使企业轻松实现b2b发布,这个信息发布软件,均是本站原创正版开发,拥有正版的血统,想要新功能,欢迎提意见给我,一好的分类信息群发软件在手,舍我其谁。QQ896757558

GMT+8, 2025-2-21 21:08 , Processed in 0.148178 second(s), 45 queries .

宣传软件--信息发布软件--b2b软件广告发布软件

快速回复 返回顶部 返回列表