DangerousNames.java Source code

Java tutorial

Introduction

Here is the source code for DangerousNames.java

Source

/*
$Proxy0
$Proxy0
*/
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/*
 *
 * This software is granted under the terms of the Common Public License,
 * CPL, which may be found at the following URL:
 * http://www-124.ibm.com/developerworks/oss/CPLv1.0.htm
 *
 * Copyright(c) 2003-2005 by the authors indicated in the @author tags.
 * All Rights are Reserved by the various authors.
 *
########## DO NOT EDIT ABOVE THIS LINE ########## */

/**  
 * Demonstrates a dangerous use of proxy names.
 * 
 * <p>
 * According to the JDK, the unqualified name of a proxy class is undefined so using it
 * in code like this could cause you grief.
 * </p>
 *
 * @author <a href=mailto:kraythe@arcor.de>Robert Simmons jr. (kraythe)</a>
 * @version $Revision: 1.2 $
 */
public class DangerousNames {
    /** 
     * Run the demonstration.
     *
     * @param args Command line arguments (ignored).
     */
    public static final void main(final String[] args) {
        SomeClass proxy = SomeClassFactory.getDynamicSomeClassProxy();
        System.out.println(proxy.getClass().getName());
        try {
            Class cl = Class.forName("$Proxy0"); // <== Dangerous!
            System.out.println(cl.getName());
        } catch (final ClassNotFoundException ex) {
            ex.printStackTrace();
        }
    }
}

class SomeClassFactory {

    /**
     * Gets a counting proxy to an object that is constructed with the user name.
     * 
     * @return The proxy to the implementation.
     */
    public static final SomeClassCountingProxy getCountingProxy() {
        SomeClassImpl impl = new SomeClassImpl(System.getProperty("user.name"));
        return new SomeClassCountingProxy(impl);
    }

    /**
     * Gets proxy to depending upon debug status in Log4J.
     * 
     * @return The proxy to the implementation.
     */
    public static final SomeClass getDynamicSomeClassProxy() {
        SomeClassImpl impl = new SomeClassImpl(System.getProperty("user.name"));
        InvocationHandler handler = new MethodCountingHandler(impl);
        Class[] interfaces = new Class[] { SomeClass.class };
        ClassLoader loader = SomeClassFactory.class.getClassLoader();
        SomeClass proxy = (SomeClass) Proxy.newProxyInstance(loader, interfaces, handler);
        return proxy;
    }

    /**
     * Gets a proxy to an object that is constructed with the user name.
     * 
     * @return The proxy to the implementation.
     */
    public static final SomeClassProxy getProxy() {
        SomeClassImpl impl = new SomeClassImpl(System.getProperty("user.name"));
        return new SomeClassProxy(impl);
    }

    /**
     * Gets proxy to depending upon debug status in Log4J.
     * 
     * @return The proxy to the implementation.
     */
    public static final SomeClass getSomeClassProxy() {
        SomeClassImpl impl = new SomeClassImpl(System.getProperty("user.name"));
        if (true) {
            return new SomeClassCountingProxy(impl);
        } else {
            return new SomeClassProxy(impl);
        }
    }
}

class SomeClassCountingProxy implements SomeClass {
    /** The implementation object for this proxy. */
    private final SomeClassImpl impl;

    /** Holds the invocation count. */
    private int invocationCount = 0;

    /** 
     * Creates a new SomeClassProxy object.
     *
     * @param impl The implementation object for this proxy.
     */
    public SomeClassCountingProxy(final SomeClassImpl impl) {
        this.impl = impl;
    }

    /** 
     * Gets the value of the property invocationCount.
     *
     * @return The current value of invocationCount
     */
    public int getInvocationCount() {
        return invocationCount;
    }

    /** 
     * @see java2s.hcj.proxies.SomeClass#someMethod()
     */
    public void someMethod() {
        this.invocationCount++;
        this.impl.someMethod();
    }

    /** 
     * @see java2s.hcj.proxies.SomeClass#someOtherMethod(java.lang.String)
     */
    public void someOtherMethod(String text) {
        this.invocationCount++;
        this.impl.someOtherMethod(text);
    }
}

class SomeClassImpl implements SomeClass {
    /** Holds the user name. */
    private String userName;

    /**
     * Creates a new SomeClass object.
     * 
     * @param userName
     *          The user name to use.
     */
    public SomeClassImpl(final String userName) {
        this.userName = userName;
    }

    /**
     * @see java2s.hcj.proxies.SomeClass#someOtherMethod(java.lang.String)
     */
    public void someMethod() {
        System.out.println(this.userName);
    }

    /**
     * @see java2s.hcj.proxies.SomeClass#someOtherMethod(java.lang.String)
     */
    public void someOtherMethod(final String text) {
        System.out.println(text);
    }
}

class SomeClassProxy implements SomeClass {
    /** The impl object for this proxy. */
    private final SomeClassImpl impl;

    /**
     * Creates a new SomeClassProxy object.
     * 
     * @param impl
     *          The implementation object for this proxy.
     */
    public SomeClassProxy(final SomeClassImpl impl) {
        this.impl = impl;
    }

    /**
     * @see java2s.hcj.proxies.SomeClass#someMethod()
     */
    public void someMethod() {
        this.impl.someMethod();
    }

    /**
     * @see java2s.hcj.proxies.SomeClass#someOtherMethod(java.lang.String)
     */
    public void someOtherMethod(String text) {
        this.impl.someOtherMethod(text);
    }
}

interface SomeClass {
    /**
     * Print out the user name.
     */
    public abstract void someMethod();

    /**
     * Print out the string given to us.
     * 
     * @param text
     *          The string to print.
     */
    public abstract void someOtherMethod(final String text);
}

/**
 * An invocation handler that counts the number of calls for all methods in the
 * target class.
 * 
 * @author <a href=mailto:kraythe@arcor.de>Robert Simmons jr. (kraythe)</a>
 * @version $Revision: 1.2 $
 * 
 * @see java.lang.reflect.InvocationHandler
 */
class MethodCountingHandler implements InvocationHandler {
    /** The implementation object for this proxy. */
    private final Object impl;

    /** Holds the invocation count. */
    private int invocationCount = 0;

    /**
     * Creates a new MethodCOuntingHandler object.
     * 
     * @param impl
     */
    public MethodCountingHandler(final Object impl) {
        this.impl = impl;
    }

    /**
     * Gets the value of the property invocationCount.
     * 
     * @return The current value of invocationCount
     */
    public int getInvocationCount() {
        return invocationCount;
    }

    /**
     * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object,
     *      java.lang.reflect.Method, java.lang.Object[])
     */
    public Object invoke(Object proxy, Method meth, Object[] args) throws Throwable {
        try {
            this.invocationCount++;
            Object result = meth.invoke(impl, args);
            return result;
        } catch (final InvocationTargetException ex) {
            throw ex.getTargetException();
        }
    }
}