@Override public boolean isCompilable() { return (Modifier.isPublic(this.member.getModifiers()) && Modifier.isPublic(this.member.getDeclaringClass().getModifiers())); }
@Override public final String getName() { return member.getName(); }
/** * Returns whether a {@link Member} is accessible. * @param m Member to check * @return {@code true} if <code>m</code> is accessible */ static boolean isAccessible(final Member m) { return m != null && Modifier.isPublic(m.getModifiers()) && !m.isSynthetic(); }
private static <T extends AccessibleObject & Member> void validateMember(T object) { int modifiers = object.getModifiers(); if ((modifiers & (PRIVATE | STATIC)) != 0) { throw new IllegalStateException(object.getDeclaringClass().getName() + "." + object.getName() + " must not be private or static"); } if ((modifiers & PUBLIC) == 0) { object.setAccessible(true); } }
@Override public final int getModifiers() { return member.getModifiers(); }
@Override public Class<?> getDeclaringClass() { return member.getDeclaringClass(); }
public String determineMemberDescription(Member member) { return member.getDeclaringClass().getName() + '#' + member.getName(); }
@Override public final boolean isSynthetic() { return member.isSynthetic(); }
public static boolean isConcrete(Member member) { int mod = member.getModifiers(); return (mod & (Modifier.INTERFACE | Modifier.ABSTRACT)) == 0; }
@Override public Class<?> getDeclaringClass() { return member.getDeclaringClass(); }
@Override public void generateCode(String propertyName, MethodVisitor mv, CodeFlow cf) { boolean isStatic = Modifier.isStatic(this.member.getModifiers()); String descriptor = cf.lastDescriptor(); String classDesc = this.member.getDeclaringClass().getName().replace('.', '/'); if (!isStatic) { if (descriptor == null) { cf.loadTarget(mv); } if (descriptor == null || !classDesc.equals(descriptor.substring(1))) { mv.visitTypeInsn(CHECKCAST, classDesc); } } else { if (descriptor != null) { // A static field/method call will not consume what is on the stack, // it needs to be popped off. mv.visitInsn(POP); } } if (this.member instanceof Method) { mv.visitMethodInsn((isStatic ? INVOKESTATIC : INVOKEVIRTUAL), classDesc, this.member.getName(), CodeFlow.createSignatureDescriptor((Method) this.member), false); } else { mv.visitFieldInsn((isStatic ? GETSTATIC : GETFIELD), classDesc, this.member.getName(), CodeFlow.toJvmDescriptor(((Field) this.member).getType())); } } }
/** * Formats a member as concise string, such as {@code java.util.ArrayList.size}, {@code * java.util.ArrayList<init>()} or {@code java.util.List.remove()}. */ public static String toString(Member member) { Class<? extends Member> memberType = Classes.memberType(member); if (memberType == Method.class) { return member.getDeclaringClass().getName() + "." + member.getName() + "()"; } else if (memberType == Field.class) { return member.getDeclaringClass().getName() + "." + member.getName(); } else if (memberType == Constructor.class) { return member.getDeclaringClass().getName() + ".<init>()"; } else { throw new AssertionError(); } }
@Override public final boolean isSynthetic() { return member.isSynthetic(); }
/** * Returns <code>true</code> if class member is public and if its declaring class is also public. */ public static boolean isPublicPublic(Member member) { if (Modifier.isPublic(member.getModifiers())) { if (Modifier.isPublic(member.getDeclaringClass().getModifiers())) { return true; } } return false; }
public static boolean isConcrete(Member member) { int mod = member.getModifiers(); return (mod & (Modifier.INTERFACE | Modifier.ABSTRACT)) == 0; }
@Override public final String getName() { return member.getName(); }
@Override public Class<?> getDeclaringClass() { return member.getDeclaringClass(); }
/** * Used by JDK serialization... * * @param oos The output stream to which we are being written... * @throws IOException Indicates a general IO stream exception */ protected void writeObject(ObjectOutputStream oos) throws IOException { oos.defaultWriteObject(); oos.writeObject( getJavaMember().getDeclaringClass().getName() ); oos.writeObject( getJavaMember().getName() ); // should only ever be a field or the getter-method... oos.writeObject( Method.class.isInstance( getJavaMember() ) ? "method" : "field" ); } }
/** * Returns whether a Member is accessible. * @param m Member to check * @return true if <code>m</code> is accessible */ static boolean isAccessible(Member m) { return m != null && Modifier.isPublic(m.getModifiers()) && !m.isSynthetic(); }
@Override public final boolean isSynthetic() { return member.isSynthetic(); }