JAVA反射其實(shí)就是那么一回事

最初使用反射的時(shí)候鸟缕,總是不理解配乱,既然可以通過(guò)new 一個(gè)對(duì)象的方式得到對(duì)象,然后通過(guò)對(duì)象去調(diào)用屬性和方法铜异,那么為什么還需要反射去調(diào)用呢?后來(lái)使用多了發(fā)現(xiàn)這就是一個(gè)先綁定還是后綁定的問(wèn)題秸架,很多初使用反射的開發(fā)人員通常都會(huì)有類似這種疑慮:既然在開發(fā)時(shí)就能夠?qū)懞么a揍庄,干嘛還放到運(yùn)行期去做,不光繁瑣东抹,而且效率也受影響蚂子。覺得主要是適用性的問(wèn)題,如果你的系統(tǒng)沒有那么高的擴(kuò)展性和靈活性要求缭黔,你大可不必考慮反射食茎。但在架構(gòu)設(shè)計(jì)時(shí),很多東西都需要考慮復(fù)用性馏谨,并且在某些特定的場(chǎng)景下你得不到具體的類時(shí)别渔,你就必須用到反射。

什么是反射:

反射的概念是由Smith在1982年首次提出的,主要是指程序可以訪問(wèn)钠糊、檢測(cè)和修改它本身狀態(tài)或行為的一種能力挟秤。這一概念的提 出很快引發(fā)了計(jì)算機(jī)科學(xué)領(lǐng)域關(guān)于應(yīng)用反射性的研究。它首先被程序語(yǔ)言的設(shè)計(jì)領(lǐng)域所采用,并在Lisp和面向?qū)ο蠓矫嫒〉昧顺煽?jī)抄伍。其中 LEAD/LEAD++ 艘刚、OpenC++ 、MetaXa和OpenJava等就是基于反射機(jī)制的語(yǔ)言截珍。

什么是Java中的類反射:

Reflection 是 Java 程序開發(fā)語(yǔ)言的特征之一攀甚,它允許運(yùn)行中的 Java 程序?qū)ψ陨磉M(jìn)行檢查,或者說(shuō)“自審”岗喉,并能直接操作程序的內(nèi)部屬性和方法秋度。Java 的這一能力在實(shí)際應(yīng)用中用得不是很多,但是在其它的程序設(shè)計(jì)語(yǔ)言中根本就不存在這一特性钱床。例如荚斯,Pascal、C 或者 C++ 中就沒有辦法在程序中獲得函數(shù)定義相關(guān)的信息查牌。
Reflection 是 Java 被視為動(dòng)態(tài)(或準(zhǔn)動(dòng)態(tài))語(yǔ)言的關(guān)鍵事期,允許程序于執(zhí)行期 Reflection APIs 取得任何已知名稱之 class 的內(nèi)部信息,包括 package纸颜、type parameters兽泣、superclass、implemented interfaces胁孙、inner classes, outer class, fields唠倦、constructors、methods涮较、modifiers稠鼻,並可于執(zhí)行期生成instances、變更 fields 內(nèi)容或喚起 methods法希。

Java反射機(jī)制: JAVA反射機(jī)制是在運(yùn)行狀態(tài)中枷餐,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法苫亦;對(duì)于任意一個(gè)對(duì)象毛肋,都能夠調(diào)用它的任意一個(gè)方法和屬性;這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱為java語(yǔ)言的反射機(jī)制屋剑。簡(jiǎn)而言之: 就是根據(jù)一個(gè)已經(jīng)實(shí)例化了的對(duì)象來(lái)還原類的完整信息
反射:獲取運(yùn)行時(shí)類型信息润匙。

Java類反射中所必須的類:

Java的類反射所需要的類并不多,它們分別是:Field唉匾、Constructor孕讳、Method匠楚、Class、Object厂财,下面我將對(duì)這些類做一個(gè)簡(jiǎn)單的說(shuō)明芋簿。

  • Field類:提供有關(guān)類或接口的屬性的信息,以及對(duì)它的動(dòng)態(tài)訪問(wèn)權(quán)限璃饱。反射的字段可能是一個(gè)類(靜態(tài))屬性或?qū)嵗龑傩杂虢铮?jiǎn)單的理解可以把它看成一個(gè)封裝反射類的屬性的類。
  • Constructor類:提供關(guān)于類的單個(gè)構(gòu)造方法的信息以及對(duì)它的訪問(wèn)權(quán)限荚恶。這個(gè)類和Field類不同撩穿,F(xiàn)ield類封裝了反射類的屬性,而Constructor類則封裝了反射類的構(gòu)造方法谒撼。
  • Method類:提供關(guān)于類或接口上單獨(dú)某個(gè)方法的信息食寡。所反映的方法可能是類方法或?qū)嵗椒ǎòǔ橄蠓椒ǎ?這個(gè)類不難理解,它是用來(lái)封裝反射類方法的一個(gè)類廓潜。
  • Class類:類的實(shí)例表示正在運(yùn)行的 Java 應(yīng)用程序中的類和接口抵皱。枚舉是一種類,注釋是一種接口辩蛋。每個(gè)數(shù)組屬于被映射為 Class 對(duì)象的一個(gè)類叨叙,所有具有相同元素類型和維數(shù)的數(shù)組都共享該 Class 對(duì)象。
  • Object類:每個(gè)類都使用 Object 作為超類堪澎。所有對(duì)象(包括數(shù)組)都實(shí)現(xiàn)這個(gè)類的方法。

獲取類的Class對(duì)象

Class類的實(shí)例表示正在運(yùn)行的Java程序中的類和接口味滞,每一個(gè)類都有對(duì)應(yīng)的Class對(duì)象樱蛤,不管一個(gè)類生成了多少個(gè)對(duì)象,這些對(duì)象都對(duì)應(yīng)內(nèi)存里的同一個(gè)Class對(duì)象剑鞍。Class類沒有public的構(gòu)造方法昨凡,Class對(duì)象是在加載類時(shí)由Java虛擬機(jī)自動(dòng)構(gòu)建的。

有以下幾種方式來(lái)獲取一個(gè)類的Class對(duì)象:

  • Class類提供的靜態(tài)方法:forName(String className)蚁署,參數(shù)className表示所需類的完全限定名便脊。
package com.boer.tdf.act.demo.reflection;

/**
 *
 * 獲取類的Class對(duì)象
 *
 * 1.Class類提供的靜態(tài)方法.
 *
 * Class類提供的靜態(tài)方法:forName(String className),參數(shù)className表示所需類的完全限定名光戈。
 */
public class GetClassObject01 {

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

        Class<?> classType = Class.forName("java.lang.String");

        System.out.println(classType);

        /**
         * 輸出:class java.lang.String
         */

    }

}
  • 運(yùn)用.class語(yǔ)法
package com.boer.tdf.act.demo.reflection;

/**
 *
 * 獲取類的Class對(duì)象
 *
 * 2.運(yùn)用.class語(yǔ)法.
 */
public class GetClassObject02 {

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

        Class<?> classType = String.class;
        System.out.println(classType);

        /**
         * 輸出:class java.lang.String
         */

    }

}
  • Object類提供的方法:getClass()
package com.boer.tdf.act.demo.reflection;

import java.util.HashMap;
import java.util.Map;

/**
 * 獲取類的Class對(duì)象.
 *
 * 3.Object類提供的方法:getClass()
 */
public class GetClassObject03 {

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

        Map map = new HashMap();
        Class<?> classType = map.getClass();

        System.out.println(classType);

        /**
         * 輸出:class java.util.HashMap
         */


    }

}

獲取類的Field(成員變量)對(duì)象

package com.boer.tdf.act.demo.reflection;

import java.lang.reflect.Field;

/**
 * 獲取類的Field(成員變量)對(duì)象.
 *
 * 類的每一個(gè)成員變量都對(duì)應(yīng)一個(gè)Field對(duì)象哪痰,Class類提供了以下方法來(lái)獲取類的成員變量對(duì)應(yīng)的Field對(duì)象:
 *
 * 1.Field getDeclaredField(String name):
 * 根據(jù)傳入的變量名稱返回此Class對(duì)象所表示的類或接口中聲明的變量對(duì)應(yīng)的Field對(duì)象。
 *
 * 2.Field[] getDeclaredFields():返回一個(gè)Field類型的數(shù)組久妆,
 * 包含此Class對(duì)象所表示的類或接口中聲明的所有變量的Field對(duì)象晌杰。
 *
 * 3.Field getField(String name):根據(jù)傳入的變量名返回一個(gè)Field對(duì)象,
 * 注意與getDeclaredField(String name)不同的是筷弦,此方法返回的是public變量對(duì)應(yīng)的Field對(duì)象肋演。
 *
 * 4.Field[] getFields():返回一個(gè)Field類型的數(shù)組,
 * 注意與Field[] getDeclaredFields()方法不同的是,此方法返回的是所有public變量對(duì)應(yīng)的Field對(duì)象爹殊。


 */
public class GetFieldObject {

    public static void main(String[] args) throws Exception {
        // 首先蜕乡,獲得String類的Class對(duì)象
        Class<?> classType = Class.forName("java.lang.String");

        // 獲得String類中聲明的所有成員變量的Field對(duì)象的數(shù)組

        Field[] fields = classType.getDeclaredFields();

        for(Field field : fields) {
            System.out.println(field);
        }

        System.out.println("----------------------------------------");

        // 獲得String類中聲明的public成員變量的Field對(duì)象的數(shù)組
        Field[] publicFields = classType.getFields();

        for(Field field : publicFields) {
            System.out.println(field);
        }


    }
}


/**
 * 輸出結(jié)果:
 *
 * private final char[] java.lang.String.value
 private int java.lang.String.hash
 private static final long java.lang.String.serialVersionUID
 private static final java.io.ObjectStreamField[] java.lang.String.serialPersistentFields
 public static final java.util.Comparator java.lang.String.CASE_INSENSITIVE_ORDER
 ----------------------------------------
 public static final java.util.Comparator java.lang.String.CASE_INSENSITIVE_ORDER

 從結(jié)果輸出可以看出getDeclaredFields()與getFields()的區(qū)別:
 getDeclaredFields()返回的是所有屬性的Field對(duì)象;
 而getFields()返回的是聲明為public的屬性的Field對(duì)象梗夸。
 */

獲取類的Method對(duì)象

package com.boer.tdf.act.demo.reflection;

import java.lang.reflect.Method;

/**
 * 獲取類的Method對(duì)象.
 *
 * 類中的每一個(gè)方法都對(duì)應(yīng)一個(gè)Method對(duì)象层玲,
 * Class類提供了以下方法來(lái)獲取類中的方法對(duì)應(yīng)的Method對(duì)象:

 1)Method getDeclaredMethod(String name, Class<?>... parameterTypes):
 返回一個(gè)Method對(duì)象,參數(shù)name表示方法名绒瘦,可變參數(shù)parameterTypes是一個(gè)Class對(duì)象的數(shù)組称簿,
 代表方法的參數(shù)的Class類型;

 2)Method[] getDeclaredMethods():返回Method對(duì)象的一個(gè)數(shù)組惰帽,
 這些對(duì)象反映此Class對(duì)象所表示的類或接口聲明的所有方法憨降,
 包括公共、保護(hù)该酗、默認(rèn)訪問(wèn)和私有方法授药,但不包括繼承的方法;

 3)Method getMethod(String name, Class<?>... parameterTypes):返回一個(gè)Method對(duì)象呜魄,
 注意和此Method對(duì)象對(duì)應(yīng)的方法是公共(public)方法悔叽;

 4)Method[] getMethods():返回一個(gè)Method數(shù)組,
 這些對(duì)象反映此Class對(duì)象所表示的類或接口中聲明的公共(public)方法
 (也包括父類或父接口中聲明的public方法)爵嗅。
 */
public class GetMethodObject {

    public static void main(String[] args) throws Exception {
        // 首先娇澎,獲得類的Class對(duì)象
        Class<?> classType = Class.forName("java.lang.reflect.Proxy");

        // 獲得類中聲明的所有方法的Method對(duì)象的數(shù)組,不包括繼承的父類的方法

        Method[] methods = classType.getDeclaredMethods();

        for(Method method : methods) {
            System.out.println(method);
        }

        System.out.println("----------------------------------------------------------------------");

        // 獲得類中的public方法的Method對(duì)象的數(shù)組睹晒,也包括繼承的父類的public方法

        Method[] publicMethods = classType.getMethods();

        for(Method method : publicMethods) {
            System.out.println(method);
        }


    }
}


/**
 * 輸出結(jié)果:
 *
 static java.lang.Object java.lang.reflect.Proxy.access$200()
 static java.lang.Class java.lang.reflect.Proxy.access$300(java.lang.ClassLoader,java.lang.String,byte[],int,int)
 public static boolean java.lang.reflect.Proxy.isProxyClass(java.lang.Class)
 private static native java.lang.Class java.lang.reflect.Proxy.defineClass0(java.lang.ClassLoader,java.lang.String,byte[],int,int)
 private static void java.lang.reflect.Proxy.checkNewProxyPermission(java.lang.Class,java.lang.Class)
 private static void java.lang.reflect.Proxy.checkProxyAccess(java.lang.Class,java.lang.ClassLoader,java.lang.Class[])
 public static java.lang.reflect.InvocationHandler java.lang.reflect.Proxy.getInvocationHandler(java.lang.Object) throws java.lang.IllegalArgumentException
 public static java.lang.Class java.lang.reflect.Proxy.getProxyClass(java.lang.ClassLoader,java.lang.Class[]) throws java.lang.IllegalArgumentException
 private static java.lang.Class java.lang.reflect.Proxy.getProxyClass0(java.lang.ClassLoader,java.lang.Class[])
 public static java.lang.Object java.lang.reflect.Proxy.newProxyInstance(java.lang.ClassLoader,java.lang.Class[],java.lang.reflect.InvocationHandler) throws java.lang.IllegalArgumentException
 ----------------------------------------------------------------------
 public static boolean java.lang.reflect.Proxy.isProxyClass(java.lang.Class)
 public static java.lang.reflect.InvocationHandler java.lang.reflect.Proxy.getInvocationHandler(java.lang.Object) throws java.lang.IllegalArgumentException
 public static java.lang.Class java.lang.reflect.Proxy.getProxyClass(java.lang.ClassLoader,java.lang.Class[]) throws java.lang.IllegalArgumentException
 public static java.lang.Object java.lang.reflect.Proxy.newProxyInstance(java.lang.ClassLoader,java.lang.Class[],java.lang.reflect.InvocationHandler) throws java.lang.IllegalArgumentException
 public final void java.lang.Object.wait() throws java.lang.InterruptedException
 public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
 public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
 public boolean java.lang.Object.equals(java.lang.Object)
 public java.lang.String java.lang.Object.toString()
 public native int java.lang.Object.hashCode()
 public final native java.lang.Class java.lang.Object.getClass()
 public final native void java.lang.Object.notify()
 public final native void java.lang.Object.notifyAll()



 *
 */

用反射機(jī)制調(diào)用對(duì)象的方法

package com.boer.tdf.act.demo.reflection;

import java.lang.reflect.Method;

/**
 * 用反射機(jī)制調(diào)用對(duì)象的方法.
 *
 *  Java反射機(jī)制可以在運(yùn)行時(shí)動(dòng)態(tài)調(diào)用類中的方法趟庄,
 *  Java Reflection API提供了我們所需的方法來(lái)完成動(dòng)態(tài)調(diào)用。
 *
 *  要想調(diào)用類中的方法首先要?jiǎng)?chuàng)建一個(gè)對(duì)象伪很,
 *  我們通過(guò)類的Class對(duì)象來(lái)創(chuàng)建它所代表的類的實(shí)例戚啥,
 *  通過(guò)Class對(duì)象我們還能獲得類中聲明的方法的Method對(duì)象,
 *  Method類提供了Invoke方法來(lái)調(diào)用此Method對(duì)象所表示的方法锉试。
 */
public class InvokeTester {

    public static int add(int a, int b) {
        return a + b;
    }

    public static String echo(String str) {
        return "hello "+str;
    }

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

        InvokeTester invoke = new InvokeTester();
        System.out.println(invoke.add(1, 2));
        System.out.println(invoke.echo("Bobby"));

        // 用反射機(jī)制調(diào)用猫十,首先獲得類的Class對(duì)象
        Class<?> classType = InvokeTester.class;
        // 通過(guò)Class對(duì)象獲得一個(gè)InvokeTester類的實(shí)例
        Object invoke2 = classType.newInstance();
        /**
         * 獲得add(int a, int b)方法的Method對(duì)象,
         * getMethod方法的參數(shù)為方法名和方法參數(shù)類型的Class對(duì)象的數(shù)組
         */
        Method addMethod = classType.getMethod("add", int.class, int.class);
        // 通過(guò)Method類的invoke方法呆盖,調(diào)用invoke對(duì)象的add方法
        Object result = addMethod.invoke(invoke2, 3, 4);
        System.out.println(result);


        Method echoMethod = classType.getMethod("echo", String.class);
        Object result2 = echoMethod.invoke(invoke, "Samba");
        System.out.println(result2);

    }


}

/**
 * 運(yùn)行結(jié)果:
 * 3
 hello Bobby
 7
 hello Samba
 */

用反射機(jī)制調(diào)用類的私有方法

package com.boer.tdf.act.demo.reflection;

/**
 * 用反射機(jī)制調(diào)用類的私有方法.
 *
 * 我們知道正常情況下一個(gè)類的私有方法只允許這個(gè)類本身來(lái)調(diào)用拖云,但使用反射機(jī)制能打破這種訪問(wèn)限制,
 * 讓其他的類也能調(diào)用這個(gè)類的私有的方法絮短。
 * 這種場(chǎng)景在實(shí)際開發(fā)中很少用到江兢,Java也不提倡這種用法。
 */
public class Private {

    // 定義一個(gè)私有方法
    private String sayHello(String name) {
        return "hello, "+name;
    }


}
package com.boer.tdf.act.demo.reflection;

import java.lang.reflect.Method;

/**
 * 用反射機(jī)制調(diào)用類的私有方法.
 *
 * 我們知道正常情況下一個(gè)類的私有方法只允許這個(gè)類本身來(lái)調(diào)用丁频,
 * 但使用反射機(jī)制能打破這種訪問(wèn)限制杉允,讓其他的類也能調(diào)用這個(gè)類的私有的方法邑贴。
 * 這種場(chǎng)景在實(shí)際開發(fā)中很少用到,Java也不提倡這種用法叔磷。
 */

public class PrivateTest {

    public static void main(String[] args) throws Exception {
        // 調(diào)用Private類的私有方法
        Private p = new Private();

        Class<?> classType = p.getClass();

        Method method = classType.getDeclaredMethod("sayHello", String.class);

        // 取消Java訪問(wèn)檢查,如果不設(shè)置此項(xiàng)則會(huì)報(bào)錯(cuò)
        method.setAccessible(true);

        String str = (String)method.invoke(p, "Bobby");

        // 輸出:hello, Bobby
        System.out.println(str);


    }
}

/**
 * Method拢驾、Field、Constructor類有一個(gè)共同的父類AccessibleObject類改基,
 * 它提供了將反射的對(duì)象標(biāo)記為在使用時(shí)取消默認(rèn)Java語(yǔ)言訪問(wèn)控制檢查的能力繁疤。
 * 在上面的代碼中,我們?cè)诜瓷鋵?duì)象Method中設(shè)置accessible標(biāo)志秕狰,
 * 它允許程序以某種通常禁止的方式來(lái)操作對(duì)象稠腊。
 */

用反射機(jī)制操作類的私有變量

package com.boer.tdf.act.demo.reflection;

/**
 * 用反射機(jī)制操作類的私有變量.
 */
public class Private2 {

    // 定義私有變量
    private String name = "zhangsan";

    public String getName() {
        return name;
    }
}

package com.boer.tdf.act.demo.reflection;

import java.lang.reflect.Field;

/**
 * 用反射機(jī)制操作類的私有變量.
 */
public class PrivateTest2 {

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

        // 改變Private2類的私有變量的值
        Private2 p = new Private2();

        Class<?> classType = p.getClass();
        Field field = classType.getDeclaredField("name");
        // 取消默認(rèn)java訪問(wèn)控制檢查,F(xiàn)ield類的父類AccessibleObject類提供的方法
        field.setAccessible(true);
        // Field類的set(Object obj, Object value)方法將指定對(duì)象上此Field對(duì)象表示的字段設(shè)置為指定的新值
        field.set(p, "lisi");
        // 輸出:lisi
        System.out.println(p.getName());

    }

}

反射的用途 Uses of Reflection

Reflection is commonly used by programs which require the ability to examine or modify the runtime behavior of applications running in the Java virtual machine. This is a relatively advanced feature and should be used only by developers who have a strong grasp of the fundamentals of the language. With that caveat in mind, reflection is a powerful technique and can enable applications to perform operations which would otherwise be impossible.
反射被廣泛地用于那些需要在運(yùn)行時(shí)檢測(cè)或修改程序行為的程序中鸣哀。這是一個(gè)相對(duì)高級(jí)的特性架忌,只有那些語(yǔ)言基礎(chǔ)非常扎實(shí)的開發(fā)者才應(yīng)該使用它。如果能把這句警示時(shí)刻放在心里我衬,那么反射機(jī)制就會(huì)成為一項(xiàng)強(qiáng)大的技術(shù)叹放,可以讓應(yīng)用程序做一些幾乎不可能做到的事情。

反射的缺點(diǎn) Drawbacks of Reflection

Reflection is powerful, but should not be used indiscriminately. If it is possible to perform an operation without using reflection, then it is preferable to avoid using it. The following concerns should be kept in mind when accessing code via reflection.

盡管反射非常強(qiáng)大挠羔,但也不能濫用井仰。如果一個(gè)功能可以不用反射完成,那么最好就不用破加。在我們使用反射技術(shù)時(shí)俱恶,下面幾條內(nèi)容應(yīng)該牢記于心:

  • 性能第一 Performance Overhead Because reflection involves types that are dynamically resolved, certain Java virtual machine optimizations can not be performed. Consequently, reflective operations have slower performance than their non-reflective counterparts, and should be avoided in sections of code which are called frequently in performance-sensitive applications.
    反射包括了一些動(dòng)態(tài)類型,所以JVM無(wú)法對(duì)這些代碼進(jìn)行優(yōu)化范舀。因此速那,反射操作的效率要比那些非反射操作低得多。我們應(yīng)該避免在經(jīng)常被 執(zhí)行的代碼或?qū)π阅芤蠛芨叩某绦蛑惺褂梅瓷洹?/p>

  • 安全限制 Security Restrictions Reflection requires a runtime permission which may not be present when running under a security manager. This is in an important consideration for code which has to run in a restricted security context, such as in an Applet. 使用反射技術(shù)要求程序必須在一個(gè)沒有安全限制的環(huán)境中運(yùn)行尿背。如果一個(gè)程序必須在有安全限制的環(huán)境中運(yùn)行,如Applet捶惜,那么這就是個(gè)問(wèn)題了田藐。。

  • 內(nèi)部暴露 Exposure of Internals Since reflection allows code to perform operations that would be illegal in non-reflective code, such as accessing private fields and methods, the use of reflection can result in unexpected side-effects, which may render code dysfunctional and may destroy portability. Reflective code breaks abstractions and therefore may change behavior with upgrades of the platform. 由于反射允許代碼執(zhí)行一些在正常情況下不被允許的操作(比如訪問(wèn)私有的屬性和方法)吱七,所以使用反射可能會(huì)導(dǎo)致意料之外的副作用--代碼有功能上的錯(cuò)誤汽久,降低可移植性。反射代碼破壞了抽象性踊餐,因此當(dāng)平臺(tái)發(fā)生改變的時(shí)候景醇,代碼的行為就有可能也隨著變化。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吝岭,一起剝皮案震驚了整個(gè)濱河市三痰,隨后出現(xiàn)的幾起案子吧寺,更是在濱河造成了極大的恐慌,老刑警劉巖散劫,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稚机,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡获搏,警方通過(guò)查閱死者的電腦和手機(jī)赖条,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)常熙,“玉大人纬乍,你說(shuō)我怎么就攤上這事÷阄溃” “怎么了仿贬?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)彼城。 經(jīng)常有香客問(wèn)我诅蝶,道長(zhǎng),這世上最難降的妖魔是什么募壕? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任调炬,我火速辦了婚禮,結(jié)果婚禮上舱馅,老公的妹妹穿的比我還像新娘缰泡。我一直安慰自己,他們只是感情好代嗤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布棘钞。 她就那樣靜靜地躺著,像睡著了一般干毅。 火紅的嫁衣襯著肌膚如雪宜猜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天硝逢,我揣著相機(jī)與錄音姨拥,去河邊找鬼。 笑死渠鸽,一個(gè)胖子當(dāng)著我的面吹牛叫乌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播徽缚,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼憨奸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了凿试?” 一聲冷哼從身側(cè)響起排宰,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤似芝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后额各,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體国觉,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年虾啦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了麻诀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡傲醉,死狀恐怖蝇闭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情硬毕,我是刑警寧澤呻引,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站吐咳,受9級(jí)特大地震影響逻悠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜韭脊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一童谒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沪羔,春花似錦饥伊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至篓吁,卻和暖如春茫因,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背杖剪。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工节腐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人摘盆。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像饱苟,于是被迫代替她去往敵國(guó)和親孩擂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理箱熬,服務(wù)發(fā)現(xiàn)类垦,斷路器狈邑,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法蚤认,內(nèi)部類的語(yǔ)法米苹,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法砰琢,線程的語(yǔ)...
    子非魚_t_閱讀 31,625評(píng)論 18 399
  • (一)Java部分 1蘸嘶、列舉出JAVA中6個(gè)比較常用的包【天威誠(chéng)信面試題】 【參考答案】 java.lang;ja...
    獨(dú)云閱讀 7,101評(píng)論 0 62
  • 人生會(huì)面臨許多選擇训唱,這些選擇會(huì)讓人生感到迷茫,不知道怎樣做抉擇挚冤,或許有的時(shí)候選擇錯(cuò)啦况增,有的時(shí)候不知道什么是對(duì),什么...
    衡鑫閱讀 287評(píng)論 0 0
  • 1训挡、好種子 a.在騰訊公益為“先心兒童”捐款6元澳骤,祝福他們都能有機(jī)會(huì)接受治療,健康快樂成長(zhǎng)澜薄。 b.繼續(xù)準(zhǔn)備分享文章...
    我是一面鏡子閱讀 141評(píng)論 0 0