java反射机制及简单工厂模式

第一步,定义一个接口类

package factory.face;

/**

  • 接口,为了保证返回的对象可以统一用 Product接受

  • @author Administrator

*/

public interface Product {

void show();

}

第二步,写两个继承了以上接口的类

package factory.extend;

import factory.face.Product;

class ProductA implements Product

{

@Override

public void show() {

System.out.println(“This is Product A!”);

}

}

 

package factory.extend;

import factory.face.Product;

class ProductB implements Product

{

@Override

public void show() {

System.out.println(“That is Product B!”);

}

}

第三步,工厂类中应用反射机制

package factory.main;

import factory.face.Product;

/**

  • 工厂类,在生产具体产品的时候,客户端只需要调用Factory 中的静态方法就可

  • @author Administrator

*

*/

public class Factory {

public static Product getProduct(String className) throws InstantiationException,

IllegalAccessException, ClassNotFoundException {

return (Product)Class.forName(className).newInstance();

}

public static void main(String[] srgs) throws InstantiationException,

IllegalAccessException, ClassNotFoundException{

Product a= Factory.getProduct(“factory.extend.ProductA”);

a.show();

Product b=Factory.getProduct(“factory.extend.ProductB”);

b.show();

}

}

以下方式,是未使用反射机制的简单工厂类,根据判断逻辑来创建具体产品

public class Factory

{

public static Product getProduct(int product_index)

{

if(product_index==0)

return new ProductA();

if(1==product_index)

return new ProductB() ;

return null;

}

}

简单工厂模式的优缺点:

优点:模式的核心是工厂类。这个类含有必要的判断逻辑,可以决定创建哪一个产品类的实例。而客户端免去了直接创建产品对象的责任,而仅仅负责“消费”产品。简单工厂模式通过这种做法实现了对责任的分割。

缺点:当产品类有复杂的多层次等级结构时,工厂类只有他自己。由于工厂类集中了所有产品创建逻辑的,如果不能正常工作的话会对系统造成很大的影响。如果使用常规的判断方法,在工厂里根据传入的参数的不同而实例化产品对象的话,代码是不可用的,因为如果增加新产品必须修改工厂角色的源码,不利于以后的维护。

PHP遍历文件夹与子目录

我们可以使用的函数有 Scandir,它的作用是列出指定路径中的文件和目录,就像 Dir 一样,

以及更强力的 Glob() 函数,作用是以数组的形式返回与指定模式相匹配的文件名或目录。 

一. 遍历单层文件夹: 

function get_dir_glob(){ 

$tree = array(); 

foreach(glob(‘./*’) as $single){ 

echo $single.”<br/>\r\n”; 

get_dir_glob(); 

二. 递归遍历文件树: 

Glob 函数扫描非常准确,并且会自动排好顺序:

$path = ‘..’; 

function get_filetree($path){ 

$tree = array(); 

foreach(glob($path.’/*’) as $single){ 

if(is_dir($single)){ 

$tree = array_merge($tree,get_filetree($single)); 

else{ 

$tree[] = $single; 

return $tree; 

print_r(get_filetree($path));

php如何识别图片的主颜色

PHP 手册中有如下说明:

imagecolorat

(PHP 4, PHP 5)

imagecolorat — Get the index of the color of a pixel

<?php

$im  =  imagecreatefrompng ( “php.png” );

$rgb  =  imagecolorat ( $im ,  10 ,  15 );

$r  = ( $rgb  >>  16 ) &  0xFF ;

$g  = ( $rgb  >>  8 ) &  0xFF ;

$b  =  $rgb  &  0xFF ;

var_dump ( $r ,  $g ,  $b );

?>

于是可以写一个专门的处理函数:

function getImageMainColor($strUrl) {

    $imageInfo = getimagesize($strUrl);

    //图片类型

    $imgType = strtolower(substr(image_type_to_extension($imageInfo[2]), 1));

    //对应函数

    $imageFun = ‘imagecreatefrom’ . ($imgType == ‘jpg’ ? ‘jpeg’ : $imgType);

    $i = $imageFun($strUrl);

    //循环色值

    $rColorNum=$gColorNum=$bColorNum=$total=0;

    for ($x=0;$x<imagesx($i);$x++) {

        for ($y=0;$y<imagesy($i);$y++) {

            $rgb = imagecolorat($i,$x,$y);

            //三通道

            $r = ($rgb >> 16) & 0xFF;

            $g = ($rgb >> 8) & 0xFF;

            $b = $rgb & 0xFF;

            $rColorNum += $r;

            $gColorNum += $g;

            $bColorNum += $b;

            $total++;

        }

    }

    $rgb = array();

    $rgb[‘r’] = round($rColorNum/$total);

    $rgb[‘g’] = round($gColorNum/$total);

    $rgb[‘b’] = round($bColorNum/$total);

    return $rgb;

 }

java笔记——接口的继承与抽象类

1.interface的多重继承

在Java类的继承中,一个衍生类只能有一个基类。也就是说,一个类不能同时继承多于一个的类。在Java中

,interface可以同时继承多于一个interface,这叫做多重继承(multiple inheritance)

我们新增一个MusicCup的接口。它既有Cup接口,又有Player接口,并增加一个display()方法原型。

interface MusicCup extends Cup, Player 

{

    void display();

}

2.抽象类

Java中提供了抽象类(abstract class)的语法,用于说明类及其方法的抽象性。比如:

abstract class Food {

    public abstract void eat();

    public void happyFood();

    {

        System.out.println(“Good!”);

    }

}

类中的方法可以声明为abstract,比如上面的eat()。这时,我们不需要具体定义方法,只需要提供该方法的

原型。这与接口类似。当我们在比如Corn类中继承该类时,需要提供eat()方法的具体定义。

类中的另一个方法happyFood()并不是当一个类中出现abstract方法时,这个类的声明必须加上abstract关键字,否则Java将报错。一个abstract类不能用于创建对象。

3.抽象类的继承

我们可以像继承类那样继承一个抽象类。我们必须用完整的方法定义,来覆盖抽象类中的抽象方法,否则,

衍生类依然是一个抽象类。

抽象类的定义中可以有数据成员。数据成员的继承与正常类的继承相同。

PHP代码的执行时间与内存消耗问题小结

PHP提供了一个查看分配的内存大小的函数memory_get_usage,原型:

int memory_get_usage ([ bool $real_usage = false ] )

$real_usage为可选参数,默认为false(即不包括memory_get_usage本身占用的内存),memory_get_usage(true)可查看包括memory_get_usage在内的内存占用情况。

该函数默认返回的是占用内存的字节数,我们可以通过除以1024来以KB为单位,再除以1024以MB为单位。

$mem=memory_get_usage();

// … 执行代码 … 

echo (memory_get_usage()-$mem)/1024;

—————————-分割线——————————————————————-

PHP计算代码执行耗时的方法:

$t1 = microtime(true); 

// … 执行代码 … 

$t2 = microtime(true); 

echo ‘used ‘.round($t2-$t1,3).’seconds’; 

microtime() 如果带个 true 参数, 返回的将是一个浮点类型. 这样 t1 和 t2 得到的就是两个浮点数, 相

减之后得到之间的差. 由于浮点的位数很长, 或者说不确定, 所以再用个 round() 取出小数点后 3 位. 

—————————-分割线———————————————————————

PHP页面消耗的最大内存默认是为 8M (在PHP的ini件里可以看到) ,如果文件太大 或图片太大 在读取的时候

会发生错误。解决办法:

1,修改 php.ini

将memory_limit由 8M 改成 16M或更大,重启apache服务

2,在PHP 文件中 加入 ini_set(”memory_limit”,”16M”);

注意:为了系统的其它资源的正常使用 请您不要将 memory_limit设置太大,其中-1为不限

3,修改.htaccess 文档(前提是该目录支持.htaccess)

在文档中新增一句:php_value memory_limit 16M或更大

PHP大批量数据操作时也可以临时调整内存与执行时间,那就不用修改php.ini参数了。

ini_set(‘memory_limit’, ‘250M’); //内存限制 

set_time_limit(0); //时间限制

 

—————————-分割线——————————————————————-

职业生涯马拉松,不着急,保持节奏即可。

找准目标,享受过程,消费结果,然后重新找目标。

java笔记——继承

通过继承,整个过程可以分为三个层次: 基类定义,衍生类定义,外部使用。

 

基类定义的层次就是正常的定义一个类。

 

在外部使用者看来,衍生类有一个统一的外部接口:

 

对于外部使用者来说,上述接口就已经足够了。仅从接口看,衍生类也没有什么特别之处。

 

 

然而,我们在衍生类定义的层次时,就要注意:

 

首先,接口是混合的: 一些来自基类,另一些方法则是在衍生类内部定义的。

 

还有更加复杂的地方。我们之前在类的内部可以自由访问类的成员(利用this指代对象)。然而,当我们在

Woman类的定义范围内,我们无法访问基类Human的private成员。我们记得private的含义: private的成员仅

供该类内部使用。Woman类是一个不同于Human类的新类,所以位于Human类的外部。在衍生类中,不能不能访

问基类的private成员。

 

 

为了清晰概念,我们需要了解衍生类对象的生成机制。当我们创建一个衍生类的对象时,Java实际上先创建

了一个基类对象(subobject),并在基类对象的外部(注意,这里是基类对象的外部,衍生类对象的内部),增

加衍生类定义的其他成员,构成一个衍生类对象。外部使用者能看到的,就是基类和衍生类的public成员。

 

super和this类似,也是隐式参数。我们在类定义的不同层次时,this会有不同的含义。要小心的使用this和

super关键字。(Java并不强制使用this和super,Java在许多情况下可以自动识别成员的归属)

 

 

Java是同时通过方法名和参数列表来判断所要调用的方法的。方法是由方法名和参数列表共同决定的。上述

问题中,如果只是方法名相同,而参数列表不同,那么两个方法会同时呈现到接口,不会给我们造成困扰。

外部调用时,Java会根据提供的参数,来决定使用哪个方法 (方法重载)。

 

如果方法名和参数列表都相同呢? 在衍生层时,我们还可以通过super和this来确定是哪一个方法。而在外

部时,我们呈现的只是统一接口,所以无法同时提供两个方法。这种情况下,Java会呈现衍生层的方法,而

不是基层的方法。

 

这种机制叫做方法覆盖(method overriding)。

标为protected的成员在该类及其衍生类中可见。这个概念很容易理解,就是说,基类的protected成员可以

被衍生层访问,但不能被外部访问。

 

位于衍生层,依然可以通过super来调用基类对象的breath()方法。当我们外部调用Woman类时,由于方法覆盖,就无法再调用基类对象的该方法了。

 

由于在创建衍生对象的时候,基类对象先被创建和初始化,所以,基类的构造方法应该先被调用。我们可以

使用super(argument list)的语句,来调用基类的构造方法。

java笔记——数据类型

我们将int, float, double, boolean等称为基本类型(primitive type),也就是特殊的类。我们可以将一个整数理解称为一个int类型的对象。int类型可以有赋值、加法、减法等操作接口。普通类型可以视作对基本类型的拓展。我们已经见过了基本类型作为数据成员、方法的参数、方法的返回值和方法内部的自动变量。自然的,普通类型的对象,比如Battery和Torch类的对象,也都可以用于这些地方。

C语言中,可用的数据类型(基本上)已经预设 好,比如int, float。在Java中,我们除了可以用这些预设的数据类型外,还可以通过类来定制自己想要的数据类型,然后通过组合来使用。但基本类型和普通类型还是 有所区别的。基本类型经常被使用,且所占据内存空间不大,所以在Java中,为了效率起见,这些基本类型与普通的类型(也就是自定义的类)的内存管理方式 不同。比如,基本类型一旦声明就会被分配内存空间,而普通类型需要使用new关键字来分配内存空间。

Java为每个基本类型提供了相应的普通类型。比如int基本类型对应Integer类型。如果将基本类型的对象转成相应的普通类型变量,所谓的基本类型也就成为了一般意义上的类型(不再有内存管理上的不同)。

这样,我们对Java“一切皆对象”的理念有了更深一步的理解。

java笔记——接口的意义

我们使用了interface,但这个interface并没有减少我们定义类时的工作量。我们依然要像之前一样,具体

的编写类。甚至须更谨慎,唯恐违反interface的规定。既如此,为何要使用interface?

interface就像是行业标准。一个工厂(类)可以采纳行业标准 (implement interface),也可以不采纳行业

标准。但,一个采纳了行业标准的产品有如下好处:

更高质量: 没有加水功能的杯子不符合标准。

更易推广: 正如电脑上的USB接口一样,下游产品可以更容易衔接。

如果我们已经有一个Java程序,用于处理符合Cup接口的对象,比如领小朋友喝水。那么,只要我们确定,

我们给小朋友的杯子(对象)实施了Cup接口,就可以确保小朋友可以执行喝水这个动作了。至于这个杯子(对

象)是如何具体定义喝水这个动作的,我们就可以留给相应的类自行决定 (比如用吸管喝水,或者开一个小

口喝水)。

Soap的错误小结

1.报类似这样的错误: Fatal error: Uncaught SoapFault exception: [Client] Function (”test”) is not a valid method for this service in……

服务器和客户端php 都需要关闭缓存,如果报找不到方法可以通过var_dump($client->__getFunctions())  

ini_set(“soap.wsdl_cache_enabled”, “0”);

 

2.报以下错误:

org.apache.axis2.AxisFault: The ServiceClass object does not implement the required method in the following form: OMElement getxxx(OMElement e)

 

是因为在services.xml中没有对该方法进行配置:

   <operation name=”getxxx”>

        <messageReceiver mep=”http://www.w3.org/2004/08/wsdl/in-out

            class=”org.apache.axis2.rpc.receivers.RPCMessageReceiver” />

    </operation> 

Eclipse导出JAR包



普通类导出jar包,该类包含main方法,并且没有用到其他的第三方jar包。

1.在eclipse中选择你要导出的类或者package,右击,选择Export子选项;

2.在弹出的对话框中,选择JAR file,单击next;

3.在JAR file后面的文本框中选择你要生成的jar包的位置以及名字,注意在Export generated class files and resources和Export java source files and resources前面打上勾,单击next;

4.单击两次next按钮,到达JAR Manifest Specification。注意在最底下的Main class后面的文本框中选择你的jar包的入口类。单击Finish,完成。

在DOS环境下,进入到jar包所在的目录,运行 java -jar 名字.jar,检测运行是否正确。

 

如果导出的程序中用到了别的jar包。比如数据库驱动包oracl.jar.。

1.先把要导出的类按照上面的步骤导出形成jar包,比如叫test.jar

2.新建一个文件夹main,比如在D盘根目录下;

3.把test.jar和oracl.jar拷贝到main文件下,右击test.jar,解压到当前文件夹。把META-INF\MANIFEST.MF剪切到另外一个地方 (例如桌面) ;

4.右击oracl.jar,解压到当前文件夹。

5.在DOS环境下,进入到D盘的main文件夹下,执行 jar cvfm new.jar meta-inf/manifest.mf .,不要忘了最后面的点。

6.用压缩工具打开新生成的new.jar,用你放在桌面的META-INF\MANIFEST.MF覆盖new.jar原有的。

在DOS环境下,进入到JAR包所在的目录,运行 java -jar 名字.jar,检测运行是否正确。

P.S.或者在eclipse中安装一个名为fatjar的插件,可方便导出包含第三方jar包的工程。

原文来自:http://www.cnblogs.com/lan0725/archive/2008/08/28/1873947.html