Using ‘findLoadedClass’ method of ClassLoader, we can check whether a class is loaded or not.
Signature
protected final Class<?> findLoadedClass(String name)
Since ‘findLoadedClass’ is a protected method, we can access this method either by extending the class ClassLoader or via reflections.
Below snippet check via reflection
private static boolean isClassLoaded(final String classBinaryName) throws NoSuchMethodException, SecurityException,
IllegalAccessException, IllegalArgumentException, InvocationTargetException {
final Method method = ClassLoader.class.getDeclaredMethod("findLoadedClass", new Class[] { String.class });
method.setAccessible(true);
final ClassLoader classLoader = ClassLoader.getSystemClassLoader();
final Object clazz = method.invoke(classLoader, classBinaryName);
return clazz != null;
}
Find the below working application.
A.java
package com.sample.app.dto;
public class A {
static {
System.out.println(A.class + " is loaded");
}
public A() {
System.out.println(A.class + " constructor is loaded");
}
}
ClassLoaderCheck.java
package com.sample.app.reflections;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import com.sample.app.dto.A;
public class ClassLoaderCheck {
private static boolean isClassLoaded(final String classBinaryName) throws NoSuchMethodException, SecurityException,
IllegalAccessException, IllegalArgumentException, InvocationTargetException {
final Method method = ClassLoader.class.getDeclaredMethod("findLoadedClass", new Class[] { String.class });
method.setAccessible(true);
final ClassLoader classLoader = ClassLoader.getSystemClassLoader();
final Object clazz = method.invoke(classLoader, classBinaryName);
return clazz != null;
}
public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException,
InvocationTargetException, NoSuchMethodException, SecurityException {
System.out.println("Is com.sample.app.dto.A loaded " + isClassLoaded("com.sample.app.dto.A"));
System.out.println("\nInstantiate A, to get it loaded by the class loader");
A a = new A();
System.out.println("\nIs com.sample.app.dto.A loaded " + isClassLoaded("com.sample.app.dto.A"));
}
}
Output
Is com.sample.app.dto.A loaded false Instantiate A, to get it loaded by the class loader class com.sample.app.dto.A is loaded class com.sample.app.dto.A constructor is loaded Is com.sample.app.dto.A loaded true
You may like
Closeable vs AutoCloseable in Java
What is the behaviour of static final method in Java?
How to check two double values for equality?
Why to do explicit type casting from double to float conversion?
When is a class or interface is initialized or loaded in Java?
No comments:
Post a Comment