Java Tutorial/Reflection/Package

Материал из Java эксперт
Перейти к: навигация, поиск

Demonstrate Package

class PkgTest {
  public static void main(String args[]) {
    Package pkgs[];
   
    pkgs = Package.getPackages();
   
    for(int i=0; i < pkgs.length; i++)
      System.out.println(
             pkgs[i].getName() + " " +
             pkgs[i].getImplementationTitle() + " " +
             pkgs[i].getImplementationVendor() + " " +
             pkgs[i].getImplementationVersion()
      );
   
  }
}





Detect if a package is available

public class Main{
  public static void  main(String args[]) {
    System.out.println(isAvailable("javax.swing.JComponent"));
  }
  public static boolean isAvailable(String className) {
    boolean isFound = false;
    try {
       Class.forName(className, false, null);
       isFound = true;
    }
    catch (ClassNotFoundException e) {
       isFound = false;
    }
    return isFound;
  }
}





Find the Package of an Object

import java.util.ArrayList;
import java.util.Vector;
public class Main {
  public static void main(String[] args) {
    System.out.println(new Vector().getClass().getPackage().getName());
    System.out.println(new ArrayList().getClass().getPackage().getName());
    System.out.println("Test String".getClass().getPackage().getName());
    System.out.println(new Integer(1).getClass().getPackage().getName());
  }
}
/*
java.util
java.util
java.lang
java.lang
*/





Get full package name

public class Main {
  public static String getPackageName(Class c) {
    String fullyQualifiedName = c.getName();
    int lastDot = fullyQualifiedName.lastIndexOf(".");
    if (lastDot == -1) {
      return "";
    }
    return fullyQualifiedName.substring(0, lastDot);
  }
  public static void main(String[] args) {
    System.out.println(getPackageName(java.awt.Frame.class));
  }
}





Get non Package Qualified Name

public class Utils {
  public static String nonPackageQualifiedName( final Class<?> clazz ) {
      String name = clazz.getName();
      return name.substring(name.lastIndexOf(".") + 1);
  }

}





Get package name of a class

import java.util.Date;
public class Main {
  public static void main(String[] args) {
    Date date = new Date();
    Package pack = date.getClass().getPackage();
    String packageName = pack.getName();
    System.out.println("Package Name = " + packageName);
  }
}





Get Package Names From Dir

/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
import java.io.File;
import java.util.List;
public final class ReflectionUtil {
  private static void getPackageNamesFromDir(File base, File dir, List<String> pkgs) {
    boolean foundClass = false;
    for (File file : dir.listFiles()) {
      if (file.isDirectory()) {
        getPackageNamesFromDir(base, file, pkgs);
      } else if (!foundClass && file.getName().endsWith(".class")) {
        foundClass = true;
        String pkg = "";
        file = dir;
        while (!file.equals(base)) {
          if (!"".equals(pkg)) {
            pkg = "." + pkg;
          }
          pkg = file.getName() + pkg;
          file = file.getParentFile();
        }
        if (!pkgs.contains(pkg)) {
          pkgs.add(pkg);
        }
      }
    }
  }
  private static String getPackageName(String clzName) {
    if (clzName.indexOf("/") == -1) {
      return null;
    }
    String packageName = clzName.substring(0, clzName.lastIndexOf("/"));
    return packageName.replace("/", ".");
  }
}





getPackage() returns null for a class in the unnamed package

public class Main {
  public static void main(String[] argv) throws Exception {
    Class cls = MyClass.class;
    Package pkg = cls.getPackage(); // null
  }
}
class MyClass{}





getPackage() returns null for a primitive type or array

public class Main {
  public static void main(String[] argv) throws Exception {
    Package pkg = int.class.getPackage(); // null
    pkg = int[].class.getPackage(); // null
  }
}





Get the class name with or without the package

public class Main {
  public static String getClassName(Class c) {
    String className = c.getName();
    int firstChar;
    firstChar = className.lastIndexOf(".") + 1;
    if (firstChar > 0) {
      className = className.substring(firstChar);
    }
    return className;
  }

  public static void main(String[] args) {
    System.out.println(getClassName(java.awt.Frame.class));
  }
}





Get the package name of the specified class.

import java.lang.reflect.Method;
import java.net.URL;
import java.security.CodeSource;
import java.security.ProtectionDomain;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/*
 * JBoss, Home of Professional Open Source
 * Copyright 2005, JBoss Inc., and individual contributors as indicated
 * by the @authors tag. See the copyright.txt in the distribution for a
 * full listing of individual contributors.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
public class Main {
  /** The string used to separator packages */
  public static final String PACKAGE_SEPARATOR = ".";
  /**
   * Get the package name of the specified class.
   * 
   * @param classname
   *          Class name.
   * @return Package name or "" if the classname is in the <i>default</i>
   *         package.
   * 
   * @throws EmptyStringException
   *           Classname is an empty string.
   */
  public static String getPackageName(final String classname) {
    if (classname.length() == 0)
      System.out.println("Empty String Exception");
    int index = classname.lastIndexOf(PACKAGE_SEPARATOR);
    if (index != -1)
      return classname.substring(0, index);
    return "";
  }
}





Get the short name of the specified class by striping off the package name.

import java.lang.reflect.Method;
import java.net.URL;
import java.security.CodeSource;
import java.security.ProtectionDomain;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/*
 * JBoss, Home of Professional Open Source
 * Copyright 2005, JBoss Inc., and individual contributors as indicated
 * by the @authors tag. See the copyright.txt in the distribution for a
 * full listing of individual contributors.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
public class Main {
  /** The string used to separator packages */
  public static final String PACKAGE_SEPARATOR = ".";
  /**
   * Get the short name of the specified class by striping off the package name.
   * 
   * @param classname
   *          Class name.
   * @return Short class name.
   */
  public static String stripPackageName(final String classname) {
    int idx = classname.lastIndexOf(PACKAGE_SEPARATOR);
    if (idx != -1)
      return classname.substring(idx + 1, classname.length());
    return classname;
  }
}





Returns the package portion of the specified class

public class Utils {
  /**
   * Returns the package portion of the specified class
   * @param className the name of the class from which to extract the package
   * @return package portion of the specified class
   */
  public static String getPackageName(final String className) {
      if (className != null) {
          final int index = className.lastIndexOf(".");
          return ((index != -1) ? className.substring(0, index) : ""); // NOI18N
      }
      return null;
  }
}