Pertanyaan Buat daftar semua subkelas dengan nama yang memenuhi syarat


Saya ingin mendapatkan daftar semua subclass dari kelas tertentu dengan nama mereka yang memenuhi syarat. Saya ingin menyalinnya dari Eclipse dan menempel ke file teks seperti ini:

 some.package.Class1
 some.package.Class2
 some.other.package.Class3
 ...

Saya sudah mencoba:

  • perbuatan Search | Java | Type, Limit to implementors. Tapi yang ini untuk beberapa alasan aneh tidak mencantumkan subclass dari subclass, hanya keturunan langsung.
  • pembukaan Hierarchy view untuk kelas yang mencetak semua subclass dalam komponen pohon, tapi pandangan ini tidak memungkinkan saya untuk memilih semua baris dan menyalin nama mereka.

Ada trik lain? Ada ratusan kelas, jadi saya ingin menghindari melakukannya secara manual.


5
2017-09-15 09:40


asal


Jawaban:


Metode dalam tampilan hierarki yang membangun hierarki pohon ada di dalam org.eclipse.jdt.internal.ui.typehierarchy.TypeHierarchyLifeCycle:

private ITypeHierarchy createTypeHierarchy(IJavaElement element, IProgressMonitor pm) throws JavaModelException {
    if (element.getElementType() == IJavaElement.TYPE) {
        IType type= (IType) element;
        if (fIsSuperTypesOnly) {
            return type.newSupertypeHierarchy(pm);
        } else {
            return type.newTypeHierarchy(pm);
        }
    } else {

Yang menggunakan org.eclipse.jdt.internal.core.SourceType kelas

/**
 * @see IType
 */
public ITypeHierarchy newTypeHierarchy(IJavaProject project, IProgressMonitor monitor) throws JavaModelException {
    return newTypeHierarchy(project, DefaultWorkingCopyOwner.PRIMARY, monitor);
}

Jadi, jika Anda bisa mendapatkan IJavaElement, Anda dapat memeriksa kelas-kelas tersebut untuk meniru hasil yang sama.

Ia menggunakan a org.eclipse.jdt.internal.core.CreateTypeHierarchyOperation


3
2017-09-15 11:29



Pembaruan: jawaban asli saya tidak akan berfungsi karena tidak ada konteks untuk pemilihan terstruktur.

Jawaban ini menunjukkan cara menyumbangkan tindakan ke menu konteks dan mengambil pilihan terstruktur. Anda dapat memodifikasi metode eksekusi jenis tersebut untuk memproses Hirarki (sebagaimana disarankan oleh VonC, memberi +1) dan mendapatkan semua sub-jenis dan mengatur konten ke clipboard sebagai berikut:

public Object execute(ExecutionEvent event) throws ExecutionException {
    IWorkbenchPart activePart = HandlerUtil.getActivePart(event);
    try {
        IStructuredSelection selection = SelectionConverter
                .getStructuredSelection(activePart);

        IJavaElement[] elements = SelectionConverter.getElements(selection);

        if (elements != null && elements.length > 0) {
            if (elements[0] != null && elements[0] instanceof IType) {
                IType type = (IType)elements[0];

                ITypeHierarchy hierarchy =
                    type.newTypeHierarchy(new NullProgressMonitor());

                IType[] subTypes = hierarchy.getAllSubtypes(type);

                StringBuffer buf = new StringBuffer();
                for (IType iType : subTypes) {
                    buf.append(iType.getFullyQualifiedName()).append("\n");
                }

                Shell shell = HandlerUtil.getActiveShell(event);

                Clipboard clipboard = new Clipboard(shell.getDisplay());

                clipboard.setContents(
                    new Object[]{buf.toString()}, 
                    new Transfer[]{TextTransfer.getInstance()});
            }
        }
    } catch (JavaModelException e) {
        logException(e);
    }
    return null;
}

3
2017-09-15 12:46



nWire untuk Java dapat memberi Anda daftar lengkap kelas yang memperpanjang kelas tertentu atau mengimplementasikan antarmuka tertentu. Anda akan mendapatkannya di navigator nWire, yang tidak menyediakan perintah penyalinan.

Namun, Anda dapat memasuki basis data nWire, yang merupakan basis data H2 standar dan memiliki struktur yang sangat sederhana, dan mendapatkan semua yang Anda butuhkan dengan kueri sederhana. Kami akan memperkenalkan kemampuan pelaporan di masa mendatang.

IMHO, itu akan kurang dari upaya dan Anda akan mendapatkan alat yang memberi Anda lebih banyak.


1
2017-09-15 12:28



Mengikuti pola yang dijelaskan dalam http://internna.blogspot.com/2007/11/java-5-retrieving-all-classes-from.html seseorang dapat melakukannya secara terprogram. Sayang sekali Eclipse tidak bisa melakukannya OOTB. Melakukannya dalam kode Java memungkinkan untuk melakukan penyaringan tanpa biaya tambahan (mis. !(klazz.isEnum())).


0
2017-09-16 07:10