You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

HiddenClassDemo.java 1.5KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. import java.lang.invoke.MethodHandles;
  2. import java.lang.reflect.Constructor;
  3. import java.io.FileInputStream;
  4. import static java.lang.invoke.MethodHandles.Lookup.ClassOption.NESTMATE;
  5. public class HiddenClassDemo {
  6. public static void main(String[] args) throws Throwable {
  7. // Step 1: Create lookup object
  8. MethodHandles.Lookup lookup = MethodHandles.lookup();
  9. // Step 2: Fetch or create the class bytes we want to define
  10. byte[] bytes = Thread.currentThread().getContextClassLoader()
  11. .getResourceAsStream("HiddenClass.class")
  12. .readAllBytes();
  13. // Step 3: Define hidden class
  14. Class<?> clazz = lookup.defineHiddenClass(bytes, true, NESTMATE).lookupClass();
  15. // Hidden classes have class names like my.package.MyClass/0x2a23f5, but no canonical name (null)
  16. System.out.println("Hidden class name = " + clazz.getName());
  17. System.out.println("Hidden class canonical name = " + clazz.getCanonicalName ());
  18. // Hidden classes cannot be resolved by any class loader (ClassNotFoundException)
  19. try {
  20. Class.forName(clazz.getName());
  21. }
  22. catch (ClassNotFoundException e) {
  23. System.out.println("Class.forName resolution error = " + e);
  24. }
  25. //Step 4: Create instance of hidden class object and call interface method
  26. Test test = (Test) clazz.getConstructor(null).newInstance(null);
  27. test.concat("Hello", "from", "dynamically", "defined", "hidden", "class");
  28. }
  29. }
  30. interface Test {
  31. void concat(String... words);
  32. }