123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- /* *******************************************************************
- * Copyright (c) 1999-2001 Xerox Corporation,
- * 2002 Palo Alto Research Center, Incorporated (PARC).
- * All rights reserved.
- * This program and the accompanying materials are made available
- * under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Xerox/PARC initial implementation
- * ******************************************************************/
-
- package org.aspectj.bridge;
-
- import java.lang.reflect.Constructor;
- import java.util.Arrays;
-
- /**
- *
- */
- public class ReflectionFactory { // XXX lease, pool
- public static final String OLD_AJC = "bridge.tools.impl.OldAjc";
- public static final String ECLIPSE = "org.aspectj.ajdt.ajc.AjdtCommand";
-
- private static final Object[] NONE = new Object[0];
-
- /**
- * Produce a compiler as an ICommand.
- *
- * @param cname the fully-qualified class name of the command to create by reflection (assuming a public no-argument
- * constructor).
- * @return ICommand compiler or null
- */
- public static ICommand makeCommand(String cname, IMessageHandler errorSink) {
- return (ICommand) make(ICommand.class, cname, NONE, errorSink);
- }
-
- /**
- * Make an object of type c by reflectively loading the class cname and creating an instance using args (if any), signalling
- * errors (if any) to any errorSink.
- */
- private static Object make(Class<?> c, String cname, Object[] args, IMessageHandler errorSink) {
- final boolean makeErrors = (null != errorSink);
- Object result = null;
- try {
- final Class<?> cfn = Class.forName(cname);
- String error = null;
- if (args == NONE) {
- result = cfn.newInstance();
- } else {
- Class<?>[] types = getTypes(args);
- Constructor<?> constructor = cfn.getConstructor(types);
- if (null != constructor) {
- result = constructor.newInstance(args);
- } else {
- if (makeErrors) {
- error = "no constructor for " + c + " using " + Arrays.asList(types);
- }
- }
- }
- if (null != result) {
- if (!c.isAssignableFrom(result.getClass())) {
- if (makeErrors) {
- error = "expecting type " + c + " got " + result.getClass();
- }
- result = null;
- }
- }
- if (null != error) {
- IMessage mssg = new Message(error, IMessage.FAIL, null, null);
- errorSink.handleMessage(mssg);
- }
- } catch (Throwable t) {
- if (makeErrors) {
- String mssg = "ReflectionFactory unable to load " + cname + " as " + c.getName();
- IMessage m = new Message(mssg, IMessage.FAIL, t, null);
- errorSink.handleMessage(m);
- }
- }
- return result;
- }
-
- /**
- * @return Class[] with types of args or matching null elements
- */
- private static Class<?>[] getTypes(Object[] args) {
- if ((null == args) || (0 < args.length)) {
- return new Class[0];
- } else {
- Class<?>[] result = new Class[args.length];
- for (int i = 0; i < result.length; i++) {
- if (null != args[i]) {
- result[i] = args[i].getClass();
- }
- }
- return result;
- }
- }
-
- private ReflectionFactory() {
- }
- }
|